About

This document contains analysis of recent data regarding wage taxes, licensing, zoning, and mobility related to Philadelphia’s nighttime economy. These analyses were originally gathered as part of my internal research by Philadelphia City Council’s Arts and Culture Task Force, Nightlife Committee. Currently, they are being used to provide key insights to the Philadelphia Commerce Department’s Night Time Economy Director as part of my advisory role to that office. They are presented here for public documentation, reproducibility, and transparency.

Attribution: Analysis by Michael Fichman, Associate Professor of Practice, University of Pennsylvania Weitzman School of Design.

Wage tax revenue data obtained from Philadelphia Controller’s Office, updated to 2023 tax year Q1, 6/18/2024. All other data obtained from Open Data Philly June, 2024.

For code base used to synthesize these data, and for previous versions of these analyses (2021 and 2022), refer to the code download button at the top of this document or visit the github repository for this page - https://github.com/mafichman/ACTF_nightlife . Data about “Save Our Stages” grants, and older tax analysis are available in Markdown documents hosted there.

Questions, contact

Takeaways

  • Restaurants have had a strong recovery from COVID. Arts, recreation and hotels are lagging. These insights are based on analysis of wage tax receipts and the opening/closure of restaurant and entertainment licenses.

  • The number of both Assembly and Entertainment licenses both continue to decrease.

  • Entertainment tax receipts are back at roughly pre-COVID levels. This tells you maybe there is more economic activity going on, but less in the way of jobs/wages in entertainment/hospitality.

  • Gun violence is decreasing significantly city-wide. Corridors and areas near nightlife licenses still have fewer incidents than than elsewhere in the city, and “destination corridors” are, on average, much much safer than expected given their traffic level. Neighborhood corridors in areas with epidemic violence continue to have significant issues.

1. Hospitality Wage Tax Receipts, 2014-2023 (Q1)

Quarterly wage tax receipts for industries in the arts and hospitality. These data only include the first quarter of 2023.

Data on nighttime-specific industries tend not to be subdivided by day and nighttime activity in wage tax data.

All dollar values adjusted for inflation (2023 dollars) based on BLS guidelines.

Takeaway: It looks like restaurants have done more rebounding than other hospitality sectors (data on new licenses confirms this). Hotels and the arts are still off the pace

1.1. Tax revenues by year in millions of dollars

Data for 2023 only represent Q1. All dollar values adjusted for inflation (2023 dollars) based on BLS guidelines.

year Arts, Entertainment, and Other Recreation Hotels Restaurants
2014 13.52 14.19 55.85
2015 16.40 13.82 59.65
2016 18.54 14.06 64.22
2017 18.76 13.74 67.02
2018 19.00 14.20 67.57
2019 21.15 14.68 70.65
2020 15.49 7.63 48.45
2021 14.15 8.75 48.45
2022 17.96 12.16 63.07
2023 4.66 3.33 15.61

1.4. Tax Loss Estimates and Recovery Timeline

Tax revenues by Q1 of FY 2023 were still falling short of expected, meaning that recovery has not been achieved. Expected revenues are based on 2014-2020(TY Q1) trends (based on year, quarter and sector) and adjusted for inflation to 2023 dollars.

Projected wage tax revenues have not yet caught up to the trend-line of activity established in the ~6 years before COVID hit.

Wage tax losses since the beginning of 2020, relative to projections based on 2014-19, are still millions of dollars below expected returns based on pre-COVID trends.

On a percentage basis, this looks like the following. Hotels are still logging much less economic activity.

Why is this happening? Wage tax returns are down across the board - and these kinds of industries externalize hospitality activity. THe only things that are really “back” are services and retail.

Total tax shortfalls (compared to pre-pandemic trend) since March, 2020, in millions (2023 dollars)

sector Est Loss (millions)
Accounting, Auditing, Bookkeeping -20.89
Advertising and Other Professional Services 15.42
Arts, Entertainment, and Other Recreation -40.69
Banking & Credit Unions -52.89
Chemicals, Petroleum Refining -62.63
City, School District, Local Quasi Govt. -42.51
College and Universities -86.46
Computer -25.65
Construction -41.28
Doctors, Dentists, and Other Health Practitioners -44.07
Education -70.70
Elementary, Secondary Schools -26.74
Employment/Outsourcing Agencies -25.89
Engineering & Architectural Services -29.79
Federal Government -48.11
Food & Beverage Products -30.17
Government -59.83
Health and Social Services 64.77
Hospitals -19.64
Hotels -47.65
Insurance -96.67
Legal Services -91.12
Machinery, Electronic, and Other Electric Equipment -34.68
Management Consulting -28.03
Manufacturing -74.67
Membership Organizations -43.12
Metal Manufacturing -41.95
Miscellaneous Manufacturing -37.88
Miscellaneous Sectors -33.20
Nursing & Personal Care Facilities -34.27
Other Educational Services -35.34
Other Governments -33.29
Other Sectors -34.79
Outpatient Care Centers and Other Health Services -20.81
Pharmaceuticals -30.60
Professional Services -11.83
Public Utilities -38.05
Publishing, Broadcasting, and Other Information -35.03
Real Estate, Rental and Leasing -39.98
Restaurants -67.80
Retail Trade 6.09
Securities / Financial Investments -44.98
Security and Investigation Services -30.71
Services to Buildings -36.45
Social Services 59.53
Sport Teams -30.17
State Government (PA) -36.86
Telecommunication -52.67
Transportation Equipment -38.63
Transportation and Warehousing -38.91
Unclassified Accounts -29.61
Wholesale Trade -48.94

2. Amusement Tax Receipts

Amusement tax revenues seem to be back.

Data from Philadelphia City Controller’s Office - 6/18/2024. Data are monthly through July, 2023

Source:

https://raw.githubusercontent.com/PhilaController/phl-budget-data/main/src/phl_budget_data/data/processed/revenue/city-collections.csv

2.1. Timeline of Amusement Tax Revenues

4. Zoning and Assembly Licenses

Last time, we created a really big rundown of SAOLs and where people were applying for them - whether that was triggering zoning changes and complicating the process. (The big takeaway was that opening up CMX-2.5 would double the amount of available parcels, and Councilmembers thought this was kind of tough to sell, but that maybe certain districts it was worth a chat).

This time the analysis is still there, but no major changes. There’s still a map of the city-wide zoning according to where SAOLs are permitted. Hopefully that’s helpful as a snapshot.

The big takeaway this year is that the number of active SAOLs in Philadelphia is still declining - more are expiring than opening. SAOLs are still being opened largely in places where there is significant zoning review, which brings council, RCOs etc., into play.

4.1. Summary of SAOL-eligible Districts

Assembly is allowed by right in four zoning districts, and by special exception in four others.

Here are some very basic descriptions of these types of zones, with information sourced from Anastasio Law - http://phillyzoning.com/

By Right

-CA-2 - Auto-oriented commercial

-CMX-4 - Commercial Mixed Use, mostly found in Center City or along major arterials like Broad, Market or Chestnut Streets

-CMX-5 - Commercial Mixed Use, found in the core of Center City office districts

-ICMX - Commercial/Industrial uses designed as a buffer between commercial and residential uses

Special Exception

-CMX-2 - Neighborhood commercial corridor, mixed use - e.g. Baltimore Avenue, Germantown Avenue

-CMX-2.5 - Commercial mixed use designed to promote pedestrian-friendly uses

-CMX-3 - Lower density commercial mixed use than CMX 4&5, found on major corridors like Kensington Ave, South St, Broad south of Washington.

-IRMX - “Low impact” industrial, including artist spaces

City-wide, roughly 26% of commercial districts (by area) are zoned for assembly by right. Much of this area is in large Center City tracts where creative spaces are unlikely to be developed due to cost or constraints of the land.

assembly_allowed sum_area Pct
By-Right 77783812 [US_survey_foot^2] 26.13 [1]
Not Permitted 47349858 [US_survey_foot^2] 15.91 [1]
Special Exception 172561837 [US_survey_foot^2] 57.97 [1]

4.2. City-wide zoning examination

The majority of areas zoned for assembly by-right are in Center City. This is not where most development of creative entertainment is taking place.

Take a look at districts outside Center City like Fishtown - by-right SAOL is not really allowed by-right anywhere.

4.3. SAOL issuance timeline

There are currently 113 SAOLs active in Philly. One major note - it seems to me that the registration of licenses in the OpenDataPhilly system is not entirely current, so these numbers are probably off by a little bit - don’t make too much of small changes or differences from year to year.

Very few SAOLs are issued in Philly, and especially few the last few years. The following chart shows the date when SAOL’s were issued. 2006 probably has data inflated by the start of the record-keeping period for these data.

The last few years we are still seeing more inactivations than activations of SAOLs

4.4. SAOLs and By-Right Zoning

Among 113 active Special Assembly Occupancy Licenses, only 27 (24%) were permitted by right in the zones where they were created. This is lower than our last assessment, when it was 28%.

assembly_allowed LONG_CODE n_licenses pct
By-Right CA-2 2 1.79
By-Right CMX-4 8 7.14
By-Right CMX-5 12 10.71
By-Right ICMX 5 4.46
Not Permitted CA-1 4 3.57
Not Permitted CMX-1 7 6.25
Not Permitted I-2 2 1.79
Not Permitted I-3 1 0.89
Not Permitted RM-1 4 3.57
Not Permitted RSA-2 1 0.89
Not Permitted RSA-3 1 0.89
Not Permitted RSA-5 4 3.57
Special Exception CMX-2 23 20.54
Special Exception CMX-2.5 12 10.71
Special Exception CMX-3 15 13.39
Special Exception IRMX 2 1.79
NA NA 9 8.04
assembly_allowed n_licenses pct
By-Right 27 24.11
Not Permitted 24 21.43
Special Exception 52 46.43
NA 9 8.04

4.5. SAOL map

5. Amusement Licenses

Here is an activation/inactivation timeline for amusement licenses - these data appear to start being reliable in about 2015 - in 2014, hundreds of licenses were added to the register (possibly due to a recording sprint).

5.1. Amusement License Map

6. Restaurant Licenses

New Activations are at a relatively good level for restaurants - they surprisingly stayed consistent through COVID and haven’t slowed down. Note there is some administration-related bump in 2004/05/06 where records were added to the database with that as the “activation” year

Active Licenses (Active minus expiring)

2024 has been a very big year already - almost at 2023 numbers through half a year (is this a record-keeping glitch?)

7. Firearm Incidents at Night in Philadelphia

There is ongoing concern about gun crime in Philadelphia, but overall numbers of incidents are down from a high in 2021. According to FBI’s uniform crime report, national rates of violent crime are down substantially from peak recorded levels in the 1990s.

This section analyzes Philadelphia Police Department (PPD) firearm incident reports from January, 2017 to June, 2024 in relation to the location of Commerce Dept. designated [commercial corridors]https://www.opendataphilly.org/dataset/commercial-corridors, and the location of food service, sidewalk cafe, special assembly occupancy, and entertainment licenses. We do not have specific information about when specific establishments open or close.

Keep in mind that these are reported incidents - subject to bias in observation, reporting, and classification.

The number of incidents in corridors is trending down along with everything else in the city. The proportion of incidents in corridors is similar to what we saw in 2021-2.

The major takeaways from our analysis are as follows:

  1. Firearm incidents are declining for the city as a whole after a peak in 2021. There is a huge drop in late 2023, mostly a decrease in robberies with firearms.

  2. Most incidents happen at night, between approximately 11PM and 1AM. The proportion of incidents happening at different hours of the day is pretty steady over time.

  3. Gun crime at night mostly happens away from establishments or commercial corridors, and mostly concentrated in neighborhoods with high volumes of incidents.

  4. If you are near a licensed establishment at night in a place with relatively low gun crime, you are much, much less likely to be exposed to an incident than if you are elsewhere.

  5. Some of the highest traffic local nightlife corridors in CC and nearby have comparatively low frequencies of incidents compared to expected.

  6. There are issues with some of the key transit corridors in West, North, lower Northeast - these are great locations for nightlife but there are significant problems with violence.

7.1. Time patterns of firearm incidents

We examined a category of incidents recorded between January 1, 2017 and June 30, 2024 - incidents classified by the PPD as Criminal Homicide, Robbery with a Firearm, Aggravated Assault with a Firearm.

Most gun crime, overall, happens in the evening, between about 11 PM and 1AM, with much of it concentrated around midnight.

The following plots show all firearm incidents since 2020, broken down by day of the week and hour reported. The 12PM (0h) time of day has the highest reporting count by far of any time of day. It is unclear how much of that is related to record-keeping practices, but it doesn’t seem like there’s a pattern.

7.2. Spatial Pattern of Nighttime Incidents

We related these firearm incidents (and other violent crime incidents) to two types of data, wanting to know how frequently incidents were happening near hospitality locations at night.

  1. Philadelphia Licenses and Inspections records of Amusement, Special Assembly Occupancy Licenses, Sidewalk Cafe licenses, and any type of Food Establishment License. and

  2. Commercial corridor boundaries kept by the Department of Commerce.

Keep in mind - we do not know particularly when these establishments are open and closed. We don’t know if an incident at 11PM outside a restaurant happens while that restaurant is in active operation. We filtered out incidents that took place near license locations when those licenses were not active (e.g. before they were created).


We examined a wide variety of violent crimes in commercial corridors and within 200 feet of restaurants, assembly and amusement businesses. This timeline shows that at any time of day, any day of the week, there are far more incidents of aggravated assault, robbery, theft, rape, sexual crimes, and homicide away from areas of hospitality activity.

It is substantially more likely one will be exposed to a violent crime at almost any hour of the day away from a licensed establishment at any time of day, as compared to a weekend night near a licensed establishment.

On average, commercial corridors have about as many incidents city-wide at 4PM as they do at 10 or PM. For the most part, violence on corridors does not spike on weekends, surprisingly.

Incidents in commercial areas, near establishments make up 10-15% of incidents city-wide at night - a steady rate for over 5 years. (As of 6/10, 1950 total incidents 6PM-6AM, 222 w/in 200 ft of a business in a corridor). We don’t have info about specific open/close hours to know exactly what businesses might have been open during what incidents.

Incidents in corridors track the city’s overall trends pretty closely.

Incidents within 200 feet of a licensed establishment also track general trends - notice how few incidents take place near establishments.

7.3. Interactive Map of Incidents in Commercial Corridors

This interactive map shows the total number of firearm incidents 6PM-6AM since 2017 reported in the City’s commercial corridors. Hover over each specific area to see a breakdown of incidents by year. The color reflects the number of incidents for the full calendar year 2023.

Some commentary regarding this map:

As we saw in 2021/22, the corridors in the city with the most firearm incidents (aggravated assault, robbery, homicide) are the ones in areas with epidemic gun violence (e.g. Kensington and Allegheny, Broad and Susquehanna, 52nd St.). This intensity is especially pronounced when you consider their size. There is also a relatively high number of incidents along the main transit corridors - the EL and the Broad St. line in West, North and lower Northeast Philly.

Some of the most popular “destination” corridors - those that have regional visitorship (Center City, Stadiums, South St, Delaware Waterfront) have very low numbers of incidents given their volume of traffic. (The stadiums have one incident since 2017!) The numbers in Fishtown, Delaware Ave, South Street - they are very low. One incident is too many, but it’s certainly notable that this is NOT the primary area where gun violence is taking place.

A notable exception to this are the East Market and West Market areas - these areas cover basically all of the Center City business district, and they have among the most incidents of any corridor (aapx 20 in 2023) …. BUT …. a) they have, by a 2019 estimate - 25x (yes you read that right) the visitation of the average Philadelphia corridor and b) they cover extremely large areas.

Incidents in the first half of 2024 are down a lot - West Market has fallen out of the top group of corridors by incident count, and overall incidents are

Students of mine analyzed 2019 phone GPS data from third parties to these corridors at night - you can look at how many people go to each corridor and from where using this app: https://sabrinasmlee.github.io/exploratory_page/home.html

7.3.1. 2023 Full Year Incidents

NAME year n
Kensington and Allegheny 2023 37
52nd Street 2023 28
Central Germantown 2023 23
Market West 2023 20
Market East 2023 19
N 22nd Street/Hope Plaza 2023 18
Broad and Susquehanna 2023 16
Erie Torresdale 2023 15
5th and Lehigh 2023 14
Broad and Hunting Park 2023 14
Broad and Logan/Wyoming 2023 14
Broad, Germantown, and Erie 2023 14
46th Street and vicinity 2023 13
60th and Market 2023 12
63rd and Girard 2023 12
Aramingo Avenue 2023 11
Broad and Girard 2023 11
Broad, Lehigh, & Glenwood 2023 11
Cottman and the Boulevard 2023 11
Woodland Avenue 2023 11
5th and the Boulevard 2023 10
Crescentville 2023 10
D and Wyoming 2023 10
Rising Sun and Wyoming 2023 10
40th and Lancaster 2023 9
5th and Lindley 2023 9
Broad and Cecil B. Moore 2023 9
Front and Allegheny 2023 9
Germantown and Lehigh 2023 9
Hunting Park Ave/Juniata Park 2023 9
West Girard 2023 9
56th and Market 2023 8
Castor and Magee 2023 8
Kensington and Somerset 2023 8
Oxford Circle 2023 8
Torresdale Avenue - Tacony 2023 8
5th and Olney 2023 7
5th, Erie, and Rising Sun 2023 7
Broad and Allegheny 2023 7
East Girard 2023 7
Hunting Park West 2023 7
Lower Aramingo Avenue 2023 7
Old City 2023 7
Rising Sun and Adams vicinity 2023 7
South Seventh Street 2023 7
Spring Garden/2nd-9th 2023 7
2nd and Girard 2023 6
2nd and Lehigh 2023 6
36th Street and vicinity 2023 6
Broad and South 2023 6
Broad and Spring Garden 2023 6
Bustleton and the Boulevard 2023 6
Central Waterfront/Spring Garden 2023 6
Elmwood Avenue 2023 6
Frankford Avenue/Church 2023 6
Kensington Ave/Harrowgate 2023 6
Old York Road and Oak Lane 2023 6
Roosevelt Plaza and vicinity 2023 6
Spring Garden/16th-23rd 2023 6
63rd and Market 2023 5
Adams and the Boulevard 2023 5
Broad and Olney 2023 5
Broad and Snyder 2023 5
Central Waterfront/Washington 2023 5
Chew and Chelten 2023 5
Chew and Washington 2023 5
Chinatown 2023 5
Frankford Avenue/Bridge-Pratt 2023 5
Frankford Avenue/Margaret-Orthodox 2023 5
Lancaster and Girard 2023 5
Oregon Ave/5th-13th 2023 5
Park West Town Center 2023 5
Pier 70 Plaza and vicinity 2023 5
Ridge and Cecil B. Moore 2023 5
Roosevelt/Cottman-Tyson 2023 5
Snyder Avenue/17th-23rd 2023 5
South Street/Front-8th 2023 5
West Lehigh 2023 5
40th Street and vicinity 2023 4
50th and Baltimore 2023 4
52nd and Haverford 2023 4
54006000 Lancaster Ave 2023 4
60th and Cedar 2023 4
9th Street - Italian Market 2023 4
Broad and Stenton/Godfrey 2023 4
Broad and Washington 2023 4
Bustleton and Harbison 2023 4
Castor and Glendale 2023 4
Cheltenham & Ogontz 2023 4
Duncannon and Mascher 2023 4
Frankford Ave - Mayfair 2023 4
Frankford Avenue - Lower Mayfair 2023 4
Frankford and Allegheny 2023 4
Front and Kensington 2023 4
North 52nd Street 2023 4
Parkway/Logan Circle 2023 4
Strawberry Square 2023 4
Wayne/Manheim-Wyneva 2023 4
Welsh and the Boulevard 2023 4
Whitman Plaza and vicinity 2023 4
10th and Snyder 2023 3
19th and Cheltenham 2023 3
20th and Hunting Park 2023 3
23rd and Walnut 2023 3
30th Street 2023 3
54th and Berks 2023 3
58th and Baltimore 2023 3
5th and Allegheny 2023 3
5th and Cheltenham 2023 3
61st and Passyunk 2023 3
63rd and Lancaster 2023 3
68th and Ogontz 2023 3
70th and Lindbergh 2023 3
Boulevard Plaza 2023 3
Broad and Morris 2023 3
Callowhill West 2023 3
Central Waterfront/Penns Landing 2023 3
Chelten Ave/Ogontz-Wister 2023 3
Chester Avenue 2023 3
East Falls 2023 3
Frankford Ave - Holmesburg 2023 3
Frankford and Megargee 2023 3
Germantown/Coulter-Logan 2023 3
Grant and the Boulevard 2023 3
One and Olney Square 2023 3
Pelham Plaza 2023 3
Pennypack Circle 2023 3
Penrose Plaza and vicinity 2023 3
Ridge and Hermit 2023 3
Rising Sun Avenue/Olney 2023 3
Snyder Plaza and Columbus Commons 2023 3
Spring Garden/9th-13th 2023 3
Wayne Junction 2023 3
20th and Passyunk 2023 2
22nd and Diamond 2023 2
31st and Norris 2023 2
36th and Lancaster 2023 2
40th and Girard 2023 2
52nd and Cedar 2023 2
65006800 Haverford Ave 2023 2
72nd and Ogontz 2023 2
Bustleton and Red Lion 2023 2
Castor and Tyson 2023 2
Castor and Wyoming 2023 2
City Avenue Shopping Center 2023 2
City and Haverford 2023 2
Cottman/Loretto-Pennway 2023 2
East Passyunk 2023 2
Germantown/Nicetown 2023 2
Harbison and Torresdale 2023 2
Holmesburg Shopping Center 2023 2
Ogontoz and Champlost 2023 2
Oxford and Levick 2023 2
Parkwood Center 2023 2
Point Breeze Avenue 2023 2
Quartermaster Plaza and vicinity 2023 2
Reed and Passyunk 2023 2
Ridge and Diamond 2023 2
South Street/16th-21st 2023 2
South Street/8th-12th 2023 2
South and Grays Ferry 2023 2
The Shoppes at LaSalle 2023 2
Torresdale Avenue - Wissinoming 2023 2
27th and Cecil B. Moore 2023 1
2nd and Fairmount 2023 1
30th and Grays Ferry 2023 1
35th and Haverford 2023 1
55th and Baltimore 2023 1
5th & Spencer 2023 1
60th and Girard 2023 1
6th and Washington 2023 1
Broad and Fairmount 2023 1
Broad and Oregon 2023 1
Bustleton / Somerton Center 2023 1
Bustleton and Tustin 2023 1
Callowhill East 2023 1
City Ave and Belmont vicinity 2023 1
City Avenue/50th-52nd 2023 1
Dungan Road 2023 1
Fairmount/19th-25th 2023 1
Five Points 2023 1
Frankford and Susquehanna 2023 1
Germantown/Roumfort-Gorgas 2023 1
Grant Plaza 2023 1
Holme Ave. and Willits Rd. 2023 1
Holme Circle 2023 1
Lansdowne Avenue 2023 1
Lawndale 2023 1
Market Square - Chestnut Hill 2023 1
Morrell Plaza and Park Center 2023 1
Palmer Park 2023 1
Philadelphia Mills 2023 1
Red Lion & Verree 2023 1
Richmond and Allegheny 2023 1
Ridge and Bells Mill 2023 1
Ridge and Shawmont 2023 1
South 4th Street 2023 1
Stenton and Mt. Airy 2023 1
Stenton and Washington Lane 2023 1
Torresdale and Levick 2023 1
Vernon Road 2023 1
Wadsworth Avenue 2023 1
Wilson Park 2023 1

7.3.2. 2024 Incidents (Jan-June 1)

NAME year n
Kensington and Allegheny 2024 13
Market East 2024 11
Erie Torresdale 2024 9
Central Germantown 2024 8
D and Wyoming 2024 8
5th and Olney 2024 7
46th Street and vicinity 2024 6
5th and Lehigh 2024 6
60th and Market 2024 6
36th Street and vicinity 2024 5
40th and Lancaster 2024 5
5th and Lindley 2024 5
Aramingo Avenue 2024 5
Broad and Cecil B. Moore 2024 5
Broad, Germantown, and Erie 2024 5
Kensington and Somerset 2024 5
Old City 2024 5
Rising Sun and Wyoming 2024 5
52nd Street 2024 4
9th Street - Italian Market 2024 4
Adams and the Boulevard 2024 4
Broad and Girard 2024 4
Broad and Hunting Park 2024 4
Broad and Spring Garden 2024 4
Broad and Susquehanna 2024 4
Broad and Washington 2024 4
Castor and Magee 2024 4
Frankford Ave - Mayfair 2024 4
Front and Kensington 2024 4
Market West 2024 4
Woodland Avenue 2024 4
2nd and Girard 2024 3
56th and Market 2024 3
5th, Erie, and Rising Sun 2024 3
Broad and Olney 2024 3
Broad, Lehigh, & Glenwood 2024 3
Cheltenham & Ogontz 2024 3
Elmwood Avenue 2024 3
Frankford Avenue/Church 2024 3
Front and Allegheny 2024 3
Germantown and Lehigh 2024 3
Lancaster and Girard 2024 3
N 22nd Street/Hope Plaza 2024 3
Point Breeze Avenue 2024 3
The Shoppes at LaSalle 2024 3
Torresdale Avenue - Tacony 2024 3
Wayne Junction 2024 3
10th and Snyder 2024 2
2nd and Lehigh 2024 2
48th and Brown 2024 2
54th and Woodland 2024 2
58th and Baltimore 2024 2
5th and Allegheny 2024 2
5th and Cheltenham 2024 2
5th and the Boulevard 2024 2
63rd and Market 2024 2
Broad and Allegheny 2024 2
Broad and Logan/Wyoming 2024 2
Broad and South 2024 2
Bustleton / Somerton Center 2024 2
Chester Avenue 2024 2
Duncannon and Mascher 2024 2
East Falls 2024 2
Five Points 2024 2
Frankford Avenue/Margaret-Orthodox 2024 2
Germantown/Coulter-Logan 2024 2
Germantown/Upsal-High 2024 2
Girard and Marshall 2024 2
Main Street - Manayunk 2024 2
North 52nd Street 2024 2
Rising Sun Avenue/Olney 2024 2
Rising Sun and Adams vicinity 2024 2
Roosevelt Plaza and vicinity 2024 2
Roosevelt/Cottman-Tyson 2024 2
West Girard 2024 2
19th and Cheltenham 2024 1
20th and Hunting Park 2024 1
20th and Passyunk 2024 1
40th Street and vicinity 2024 1
40th and Girard 2024 1
46th and Baltimore 2024 1
50th and Baltimore 2024 1
54th and Berks 2024 1
56th and Cedar 2024 1
5th & Spencer 2024 1
63rd and Girard 2024 1
68th and Ogontz 2024 1
Academy Plaza 2024 1
Broad and Snyder 2024 1
Broad and Stenton/Godfrey 2024 1
Bustleton Avenue-Rhawnhurst 2024 1
Bustleton/Welsh/Grant and Vicinity 2024 1
C and Allegheny 2024 1
Callowhill East 2024 1
Castor and Wyoming 2024 1
Central Waterfront/Spring Garden 2024 1
Chew and Washington 2024 1
Chinatown 2024 1
City and Haverford 2024 1
Cottman and the Boulevard 2024 1
Crescentville 2024 1
Frankford Avenue - Lower Mayfair 2024 1
Frankford Avenue/Bridge-Pratt 2024 1
Frankford and Allegheny 2024 1
Frankford and Megargee 2024 1
Frankford and Susquehanna 2024 1
Germantown/Nicetown 2024 1
Germantown/Roumfort-Gorgas 2024 1
Girard and Ridge 2024 1
Godfrey and Ogontz 2024 1
Harbison and Torresdale 2024 1
Kensington Ave/Harrowgate 2024 1
Knights Road Center and Vicinity 2024 1
Lansdowne Avenue 2024 1
Lawndale 2024 1
Old York Road and Oak Lane 2024 1
Oxford and Levick 2024 1
Packer Park 2024 1
Palmer Park 2024 1
Park West Town Center 2024 1
Parkway/Logan Circle 2024 1
Philadelphia Mills 2024 1
Quartermaster Plaza and vicinity 2024 1
Red Lion & Verree 2024 1
Reed and Passyunk 2024 1
Richmond and Allegheny 2024 1
Ridge and Cecil B. Moore 2024 1
Spring Garden/16th-23rd 2024 1
Stenton and Mt. Airy 2024 1
Torresdale and Levick 2024 1
Wayne/Manheim-Wyneva 2024 1
West Lehigh 2024 1
Woodland and Island Avenues 2024 1
LS0tDQp0aXRsZTogIlBoaWxhZGVscGhpYSBOaWdodCBUaW1lIERhdGEgRGlnZXN0LCAyMDI0Ig0KYXV0aG9yOiAiTWljaGFlbCBGaWNobWFuIg0KZGF0ZTogIkp1bHkgMTcsIDIwMjQiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShsZWFmbGV0LmV4dHJhcykNCmxpYnJhcnkobGVhZmxldC5wcm92aWRlcnMpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShnZ21hcCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRpZ3JpcykNCmxpYnJhcnkobWFwdmlldykNCmxpYnJhcnkoaHR0cikNCg0KcGxvdFRoZW1lIDwtIHRoZW1lKA0KICBwbG90LnRpdGxlID1lbGVtZW50X3RleHQoc2l6ZT0xMiksDQogIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwNCiAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgIyBTZXQgdGhlIGVudGlyZSBjaGFydCByZWdpb24gdG8gYmxhbmsNCiAgcGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCksDQogIHBsb3QuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCksDQogICNwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG91cj0iI0YwRjBGMCIpLA0KICAjIEZvcm1hdCB0aGUgZ3JpZA0KICBwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfbGluZShjb2xvdXI9IiNEMEQwRDAiLHNpemU9Ljc1KSwNCiAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCkpDQoNCm1hcFRoZW1lIDwtIHRoZW1lKHBsb3QudGl0bGUgPWVsZW1lbnRfdGV4dChzaXplPTEyKSwNCiAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwNCiAgICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgICAgICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQ9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9saW5lKGNvbG91ciA9ICd0cmFuc3BhcmVudCcpLA0KICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIiwgDQogICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMSwgMSwgMSwgMSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMSwgImNtIiksIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMiwgImNtIikpDQoNCiN0aGUgbWFnaWMgaGFwcGVucyBoZXJlIC0gZ2dtYXAgZnVuY3Rpb24NCmxsIDwtIGZ1bmN0aW9uKGRhdCwgcHJvajQgPSA0MzI2KXsNCiAgc3RfdHJhbnNmb3JtKGRhdCwgcHJvajQpDQp9DQoNCmBgYA0KDQpgYGB7ciAsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZT1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWUgPC0gcmVhZF9leGNlbCgifi9HaXRIdWIvQUNURl9uaWdodGxpZmUvZGF0YS93YWdlLXRheC1yZXZlbnVlLnhsc3giKSAlPiUNCiAgcmVuYW1lKEFydHNfRW50ZXJ0YWlubWVudF9SZWNyZWF0aW9uID0gJ0FydHMsIEVudGVydGFpbm1lbnQsIGFuZCBPdGhlciBSZWNyZWF0aW9uJykgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcih5bWQoZGF0ZSkpLA0KICAgICAgICAgbW9udGggPSBtb250aCh5bWQoZGF0ZSkpKQ0KDQpgYGANCg0KYGBge3Igd2FybmluZz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHMgPSAiaGlkZSJ9DQojIExvYWQgZGF0YSwgcmVtb3ZlIGR1cGxpY2F0ZXMsIGFkanVzdCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgZG9sbGFycw0KIyBOZXcgZGF0YSBhcmUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL1BoaWxhQ29udHJvbGxlci9waGwtYnVkZ2V0LWRhdGEvYmxvYi9tYWluL3NyYy9waGxfYnVkZ2V0X2RhdGEvZGF0YS9wcm9jZXNzZWQvY29sbGVjdGlvbnMvd2FnZS1jb2xsZWN0aW9ucy1ieS1zZWN0b3IuY3N2DQp3YWdlX3RheF9yZXZlbnVlX25ldyA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1BoaWxhQ29udHJvbGxlci9waGwtYnVkZ2V0LWRhdGEvbWFpbi9zcmMvcGhsX2J1ZGdldF9kYXRhL2RhdGEvcHJvY2Vzc2VkL2NvbGxlY3Rpb25zL3dhZ2UtY29sbGVjdGlvbnMtYnktc2VjdG9yLmNzdiIpICU+JQ0KICAgIG11dGF0ZSh5ZWFyID0geWVhcih5bWQoZGF0ZSkpLA0KICAgICAgICAgICBtb250aCA9IG1vbnRoKHltZChkYXRlKSkpICU+JQ0KICBncm91cF9ieShmaXNjYWxfeWVhciwgZmlzY2FsX3F1YXJ0ZXIsIHNlY3RvcikgJT4lDQogIHNsaWNlKDEpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZSh0b3RhbCA9IGNhc2Vfd2hlbih5ZWFyID09IDIwMTQgfiB0b3RhbCAqIDEuMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTUgfiB0b3RhbCAqIDEuMjgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTYgfiB0b3RhbCAqIDEuMjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTcgfiB0b3RhbCAqIDEuMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTggfiB0b3RhbCAqIDEuMjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTkgfiB0b3RhbCAqIDEuMTksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjAgfiB0b3RhbCAqIDEuMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjEgfiB0b3RhbCAqIDEuMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjIgfiB0b3RhbCAqIDEuMDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjMgfiB0b3RhbCAqIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjQgfiB0b3RhbCAqIDEpKQ0KDQojIENvdW50eSBTaGFwZWZpbGUNCnBoaWxhX3NocCA8LSBjb3VudGllcygiUEEiKSAlPiUNCiAgZmlsdGVyKE5BTUUgPT0gIlBoaWxhZGVscGhpYSIpICU+JQ0KICBzdF9hc19zZihjcnMgPSA0MzI2KQ0KDQojIExvYWQgZGlzdHJpY3RzIGZyb20gT3BlbkRhdGFQaGlsbHkNCmNvdW5jaWxEaXN0cmljdHMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9vcGVuZGF0YS5hcmNnaXMuY29tL2RhdGFzZXRzLzkyOThjMmYzZmEzMjQxZmJiMTc2ZmYxZTg0ZDMzMzYwXzAuZ2VvanNvbiIpICU+JQ0KICBzdF90cmFuc2Zvcm0oY3JzID0gNDMyNikgDQoNCmBgYA0KDQojIEFib3V0DQoNClRoaXMgZG9jdW1lbnQgY29udGFpbnMgYW5hbHlzaXMgb2YgcmVjZW50IGRhdGEgcmVnYXJkaW5nIHdhZ2UgdGF4ZXMsIGxpY2Vuc2luZywgem9uaW5nLCBhbmQgbW9iaWxpdHkgcmVsYXRlZCB0byBQaGlsYWRlbHBoaWEncyBuaWdodHRpbWUgZWNvbm9teS4gVGhlc2UgYW5hbHlzZXMgd2VyZSBvcmlnaW5hbGx5IGdhdGhlcmVkIGFzIHBhcnQgb2YgbXkgaW50ZXJuYWwgcmVzZWFyY2ggYnkgUGhpbGFkZWxwaGlhIENpdHkgQ291bmNpbCdzIEFydHMgYW5kIEN1bHR1cmUgVGFzayBGb3JjZSwgTmlnaHRsaWZlIENvbW1pdHRlZS4gQ3VycmVudGx5LCB0aGV5IGFyZSBiZWluZyB1c2VkIHRvIHByb3ZpZGUga2V5IGluc2lnaHRzIHRvIHRoZSBQaGlsYWRlbHBoaWEgQ29tbWVyY2UgRGVwYXJ0bWVudCdzIE5pZ2h0IFRpbWUgRWNvbm9teSBEaXJlY3RvciBhcyBwYXJ0IG9mIG15IGFkdmlzb3J5IHJvbGUgdG8gdGhhdCBvZmZpY2UuIFRoZXkgYXJlIHByZXNlbnRlZCBoZXJlIGZvciBwdWJsaWMgZG9jdW1lbnRhdGlvbiwgcmVwcm9kdWNpYmlsaXR5LCBhbmQgdHJhbnNwYXJlbmN5Lg0KDQpBdHRyaWJ1dGlvbjogQW5hbHlzaXMgYnkgTWljaGFlbCBGaWNobWFuLCBBc3NvY2lhdGUgUHJvZmVzc29yIG9mIFByYWN0aWNlLCBVbml2ZXJzaXR5IG9mIFBlbm5zeWx2YW5pYSBXZWl0em1hbiBTY2hvb2wgb2YgRGVzaWduLiANCg0KV2FnZSB0YXggcmV2ZW51ZSBkYXRhIG9idGFpbmVkIGZyb20gUGhpbGFkZWxwaGlhIENvbnRyb2xsZXIncyBPZmZpY2UsIHVwZGF0ZWQgdG8gMjAyMyB0YXggeWVhciBRMSwgNi8xOC8yMDI0LiBBbGwgb3RoZXIgZGF0YSBvYnRhaW5lZCBmcm9tIE9wZW4gRGF0YSBQaGlsbHkgSnVuZSwgMjAyNC4NCg0KRm9yIGNvZGUgYmFzZSB1c2VkIHRvIHN5bnRoZXNpemUgdGhlc2UgZGF0YSwgYW5kIGZvciBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGVzZSBhbmFseXNlcyAoMjAyMSBhbmQgMjAyMiksIHJlZmVyIHRvIHRoZSBjb2RlIGRvd25sb2FkIGJ1dHRvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZG9jdW1lbnQgb3IgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IGZvciB0aGlzIHBhZ2UgLSBodHRwczovL2dpdGh1Yi5jb20vbWFmaWNobWFuL0FDVEZfbmlnaHRsaWZlIC4gRGF0YSBhYm91dCAiU2F2ZSBPdXIgU3RhZ2VzIiBncmFudHMsIGFuZCBvbGRlciB0YXggYW5hbHlzaXMgYXJlIGF2YWlsYWJsZSBpbiBNYXJrZG93biBkb2N1bWVudHMgaG9zdGVkIHRoZXJlLg0KDQpRdWVzdGlvbnMsIGNvbnRhY3QgbWZpY2htYW5AdXBlbm4uZWR1DQoNCiMgVGFrZWF3YXlzDQoNCi0gUmVzdGF1cmFudHMgaGF2ZSBoYWQgYSBzdHJvbmcgcmVjb3ZlcnkgZnJvbSBDT1ZJRC4gQXJ0cywgcmVjcmVhdGlvbiBhbmQgaG90ZWxzIGFyZSBsYWdnaW5nLiBUaGVzZSBpbnNpZ2h0cyBhcmUgYmFzZWQgb24gYW5hbHlzaXMgb2Ygd2FnZSB0YXggcmVjZWlwdHMgYW5kIHRoZSBvcGVuaW5nL2Nsb3N1cmUgb2YgcmVzdGF1cmFudCBhbmQgZW50ZXJ0YWlubWVudCBsaWNlbnNlcy4NCg0KLSBUaGUgbnVtYmVyIG9mIGJvdGggQXNzZW1ibHkgYW5kIEVudGVydGFpbm1lbnQgbGljZW5zZXMgYm90aCBjb250aW51ZSB0byBkZWNyZWFzZS4NCg0KLSBFbnRlcnRhaW5tZW50IHRheCByZWNlaXB0cyBhcmUgYmFjayBhdCByb3VnaGx5IHByZS1DT1ZJRCBsZXZlbHMuIFRoaXMgdGVsbHMgeW91IG1heWJlIHRoZXJlIGlzIG1vcmUgZWNvbm9taWMgYWN0aXZpdHkgZ29pbmcgb24sIGJ1dCBsZXNzIGluIHRoZSB3YXkgb2Ygam9icy93YWdlcyBpbiBlbnRlcnRhaW5tZW50L2hvc3BpdGFsaXR5Lg0KDQotIEd1biB2aW9sZW5jZSBpcyBkZWNyZWFzaW5nIHNpZ25pZmljYW50bHkgY2l0eS13aWRlLiBDb3JyaWRvcnMgYW5kIGFyZWFzIG5lYXIgbmlnaHRsaWZlIGxpY2Vuc2VzIHN0aWxsIGhhdmUgZmV3ZXIgaW5jaWRlbnRzIHRoYW4gdGhhbiBlbHNld2hlcmUgaW4gdGhlIGNpdHksIGFuZCAiZGVzdGluYXRpb24gY29ycmlkb3JzIiBhcmUsIG9uIGF2ZXJhZ2UsIG11Y2ggbXVjaCBzYWZlciB0aGFuIGV4cGVjdGVkIGdpdmVuIHRoZWlyIHRyYWZmaWMgbGV2ZWwuIE5laWdoYm9yaG9vZCBjb3JyaWRvcnMgaW4gYXJlYXMgd2l0aCBlcGlkZW1pYyB2aW9sZW5jZSBjb250aW51ZSB0byBoYXZlIHNpZ25pZmljYW50IGlzc3Vlcy4NCg0KIyAxLiBIb3NwaXRhbGl0eSBXYWdlIFRheCBSZWNlaXB0cywgMjAxNC0yMDIzIChRMSkNCg0KUXVhcnRlcmx5IHdhZ2UgdGF4IHJlY2VpcHRzIGZvciBpbmR1c3RyaWVzIGluIHRoZSBhcnRzIGFuZCBob3NwaXRhbGl0eS4gVGhlc2UgZGF0YSBvbmx5IGluY2x1ZGUgdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAyMy4NCg0KRGF0YSBvbiBuaWdodHRpbWUtc3BlY2lmaWMgaW5kdXN0cmllcyB0ZW5kIG5vdCB0byBiZSBzdWJkaXZpZGVkIGJ5IGRheSBhbmQgbmlnaHR0aW1lIGFjdGl2aXR5IGluIHdhZ2UgdGF4IGRhdGEuDQoNCkFsbCBkb2xsYXIgdmFsdWVzIGFkanVzdGVkIGZvciBpbmZsYXRpb24gKDIwMjMgZG9sbGFycykgYmFzZWQgb24gQkxTIGd1aWRlbGluZXMuDQoNClRha2Vhd2F5OiBJdCBsb29rcyBsaWtlIHJlc3RhdXJhbnRzIGhhdmUgZG9uZSBtb3JlIHJlYm91bmRpbmcgdGhhbiBvdGhlciBob3NwaXRhbGl0eSBzZWN0b3JzIChkYXRhIG9uIG5ldyBsaWNlbnNlcyBjb25maXJtcyB0aGlzKS4gSG90ZWxzIGFuZCB0aGUgYXJ0cyBhcmUgc3RpbGwgb2ZmIHRoZSBwYWNlDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoIlJlc3RhdXJhbnRzIiwgIkFydHMsIEVudGVydGFpbm1lbnQsIGFuZCBPdGhlciBSZWNyZWF0aW9uIiwgIkhvdGVscyIpKSAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgc2VjdG9yKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh0b3RhbCksDQogICAgICAgICAgICBzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXN1bSwgY29sb3IgPSBzZWN0b3IpKSsNCiAgeWxhYigiUXVhcnRlcmx5IFdhZ2UgVGF4IFJldmVudWUgKCQgTWlsbGlvbnMpIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgV2FnZSBUYXggUmVjZWlwdHMgZm9yIFRocmVlIEhvc3BpdGFsaXR5IEluZHVzdHJpZXMiLA0KICAgIHN1YnRpdGxlID0gIkFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMyBEb2xsYXJzLiBTb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UsIEJMUyIpKw0KICBwbG90VGhlbWUNCmBgYA0KDQojIyAxLjEuIFRheCByZXZlbnVlcyBieSB5ZWFyIGluIG1pbGxpb25zIG9mIGRvbGxhcnMNCg0KRGF0YSBmb3IgMjAyMyBvbmx5IHJlcHJlc2VudCBRMS4gQWxsIGRvbGxhciB2YWx1ZXMgYWRqdXN0ZWQgZm9yIGluZmxhdGlvbiAoMjAyMyBkb2xsYXJzKSBiYXNlZCBvbiBCTFMgZ3VpZGVsaW5lcy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICAgIGZpbHRlcihzZWN0b3IgJWluJSBjKCJSZXN0YXVyYW50cyIsICJBcnRzLCBFbnRlcnRhaW5tZW50LCBhbmQgT3RoZXIgUmVjcmVhdGlvbiIsICJIb3RlbHMiKSkgJT4lDQogIGdyb3VwX2J5KHllYXIsIHNlY3RvcikgJT4lDQogIHN1bW1hcml6ZShzdW0gPSBzdW0odG90YWwpKSAlPiUNCiAgbXV0YXRlKHN1bSA9IHJvdW5kKChzdW0vMTAwMDAwMCksIGRpZ2l0cyA9IDIpKSAlPiUNCiAgc3ByZWFkKHNlY3Rvciwgc3VtKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQoNCmBgYA0KDQoNCiMjIDEuNC4gVGF4IExvc3MgRXN0aW1hdGVzIGFuZCBSZWNvdmVyeSBUaW1lbGluZQ0KDQpUYXggcmV2ZW51ZXMgYnkgUTEgb2YgRlkgMjAyMyB3ZXJlIHN0aWxsIGZhbGxpbmcgc2hvcnQgb2YgZXhwZWN0ZWQsIG1lYW5pbmcgdGhhdCByZWNvdmVyeSBoYXMgbm90IGJlZW4gYWNoaWV2ZWQuIEV4cGVjdGVkIHJldmVudWVzIGFyZSBiYXNlZCBvbiAyMDE0LTIwMjAoVFkgUTEpIHRyZW5kcyAoYmFzZWQgb24geWVhciwgcXVhcnRlciBhbmQgc2VjdG9yKSBhbmQgYWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIzIGRvbGxhcnMuDQoNCmBgYHtyIG1vZGVsLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQ0KbW9kZWwgPC0gbG0oZGF0YSA9IHdhZ2VfdGF4X3JldmVudWVfbmV3ICU+JSBmaWx0ZXIoeWVhciA8IDIwMjApICU+JSBzZWxlY3Qoc2VjdG9yLCBmaXNjYWxfcXVhcnRlciwgeWVhciwgdG90YWwpLCB0b3RhbCB+IGFzLmZhY3RvcihmaXNjYWxfcXVhcnRlcikgKyB5ZWFyICsgc2VjdG9yKQ0KDQpzdW1tYXJ5KG1vZGVsKQ0KDQoNCnByZWRpY3QobW9kZWwsIHdhZ2VfdGF4X3JldmVudWVfbmV3KSAlPiUgDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUgDQogIHJlbmFtZShwcmVkID0gIi4iKSAlPiUgDQogIGNiaW5kKC4sIHdhZ2VfdGF4X3JldmVudWVfbmV3KSAtPiB3YWdlX3RheF9yZXZlbnVlX25ldw0KYGBgDQoNClByb2plY3RlZCB3YWdlIHRheCByZXZlbnVlcyBoYXZlIG5vdCB5ZXQgY2F1Z2h0IHVwIHRvIHRoZSB0cmVuZC1saW5lIG9mIGFjdGl2aXR5IGVzdGFibGlzaGVkIGluIHRoZSB+NiB5ZWFycyBiZWZvcmUgQ09WSUQgaGl0Lg0KDQpgYGB7ciBwcm9qZWN0aW9uX2NoYXJ0LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogIHN1bW1hcml6ZShBY3R1YWwgPSBzdW0odG90YWwpLCANCiAgICAgICAgICAgIFByZS5QYW5kZW1pYy5UcmVuZCA9IHN1bShwcmVkKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDE4KSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoZGF0ZSwgc2VjdG9yLCBBY3R1YWwsIFByZS5QYW5kZW1pYy5UcmVuZCkgJT4lDQogIGdhdGhlcigtc2VjdG9yLCAtIGRhdGUsIGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIikgJT4lDQogIG11dGF0ZSh2YWx1ZV9tID0gcm91bmQodmFsdWUvMTAwMDAwMCwgZGlnaXRzID0gMikpICU+JQ0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiUmVzdGF1cmFudHMiLCAiQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIE90aGVyIFJlY3JlYXRpb24iLCAiSG90ZWxzIikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXZhbHVlX20sIGNvbG9yID0gdmFyaWFibGUpKSsgDQogICAgZ2VvbV9saW5lKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT12YWx1ZV9tLCBjb2xvciA9IHZhcmlhYmxlKSwgDQogICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYSA9IDAuNSkrDQogIGZhY2V0X3dyYXAofnNlY3RvcikrDQogICAgeWxhYigiUXVhcnRlcmx5IFdhZ2UgVGF4IFJldmVudWUgKCQgTWlsbGlvbnMpIikrDQogICAgeGxhYigiRGF0ZSIpKw0KICAgIGxhYnMoDQogICAgICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBXYWdlIFRheCBTaG9ydGZhbGxzIiwNCiAgICAgICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIzIERvbGxhcnMuXG4gVHJlbmQgYmFzZWQgb24gVFkgUTEgMjAxNC0gUTEgMjAyMCByZWdyZXNzaW9uIGNvbnRyb2xsaW5nIGZvciB5ZWFyLCBxdWFydGVyLCBzZWN0b3IuIFxuU291cmNlOiBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlLCBCTFMiKSsNCiAgICBwbG90VGhlbWUNCg0KYGBgDQoNCldhZ2UgdGF4IGxvc3NlcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIDIwMjAsIHJlbGF0aXZlIHRvIHByb2plY3Rpb25zIGJhc2VkIG9uIDIwMTQtMTksIGFyZSBzdGlsbCBtaWxsaW9ucyBvZiBkb2xsYXJzIGJlbG93IGV4cGVjdGVkIHJldHVybnMgYmFzZWQgb24gcHJlLUNPVklEIHRyZW5kcy4NCg0KYGBge3IgcHJvamVjdGlvbl9jaGFydF9iYXIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvPUZBTFNFfQ0Kd2FnZV90YXhfcmV2ZW51ZV9uZXcgJT4lDQogIGdyb3VwX2J5KGRhdGUsIHNlY3RvciwgeWVhciwgbW9udGgpICU+JSANCiAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpKSAlPiUgDQogIG11dGF0ZShsb3NzID0gQWN0dWFsIC0gUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMjAyMCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGRhdGUsIHNlY3RvciwgbG9zcykgJT4lDQogIGdhdGhlcigtc2VjdG9yLCAtIGRhdGUsIGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIikgJT4lDQogIG11dGF0ZSh2YWx1ZV9tID0gcm91bmQodmFsdWUvMTAwMDAwMCwgZGlnaXRzID0gMikpICU+JQ0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiUmVzdGF1cmFudHMiLCAiQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIE90aGVyIFJlY3JlYXRpb24iLCAiSG90ZWxzIikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2JhcihhZXMoeCA9IGFzLkRhdGUoZGF0ZSksIHk9dmFsdWVfbSksIHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJncmV5IikrIA0KICBmYWNldF93cmFwKH5zZWN0b3IpKw0KICAgIHlsYWIoIlF1YXJ0ZXJseSBXYWdlIFRheCBSZXZlbnVlIHNob3J0ZmFsbCAoJCBNaWxsaW9ucykiKSsNCiAgICB4bGFiKCJEYXRlIikrDQogICAgbGFicygNCiAgICAgICAgdGl0bGUgPSAiUGhpbGFkZWxwaGlhIFdhZ2UgVGF4IFJlY2VpcHRzIHZzLiBQcmUtUGFuZGVtaWMgVHJlbmRzIiwNCiAgICAgICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIzIERvbGxhcnMuIFNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSwgQkxTIikrDQogICAgcGxvdFRoZW1lDQoNCmBgYA0KDQpPbiBhIHBlcmNlbnRhZ2UgYmFzaXMsIHRoaXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLiBIb3RlbHMgYXJlIHN0aWxsIGxvZ2dpbmcgbXVjaCBsZXNzIGVjb25vbWljIGFjdGl2aXR5Lg0KDQpgYGB7ciBzaG9ydGZhbGxfcGN0LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICAgIGdyb3VwX2J5KGRhdGUsIHNlY3RvciwgeWVhciwgbW9udGgpICU+JSANCiAgICBzdW1tYXJpemUoQWN0dWFsID0gc3VtKHRvdGFsKSwgDQogICAgICAgICAgICAgIFByZS5QYW5kZW1pYy5UcmVuZCA9IHN1bShwcmVkKSwgDQogICAgICAgICAgICAgIHBjdF9kaWZmID0gMTAwKigoQWN0dWFsLVByZS5QYW5kZW1pYy5UcmVuZCkvUHJlLlBhbmRlbWljLlRyZW5kKSkgJT4lDQogICAgZmlsdGVyKHllYXIgPj0gMjAyMCkgJT4lDQogICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiUmVzdGF1cmFudHMiLCAiQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIE90aGVyIFJlY3JlYXRpb24iLCAiSG90ZWxzIikpICU+JQ0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fYmFyKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT1wY3RfZGlmZiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKyANCiAgICBmYWNldF93cmFwKH5zZWN0b3IpKw0KICAgIHlsYWIoIlF1YXJ0ZXJseSBUYXggUmV2ZW51ZSB2cy4gRXhwZWN0ZWQgKCUpIikrDQogICAgeGxhYigiRGF0ZSIpKw0KICAgIGxhYnMoDQogICAgICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBXYWdlIFRheCAtIFBlcmNlbnRhZ2UgU2hvcnRmYWxsIHZzIFByZS1QYW5kZW1pYyBUcmVuZHMiLA0KICAgICAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjMgRG9sbGFycy5cbiBUcmVuZCBiYXNlZCBvbiAyMDE0LUNPVklEIHJlZ3Jlc3Npb24gY29udHJvbGxpbmcgZm9yIHllYXIsIHF1YXJ0ZXIsIHNlY3Rvci4gXG5Tb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UsIEJMUyIpKw0KICAgIHBsb3RUaGVtZQ0KYGBgDQoNCmBgYHtyIGluZHVzdHJ5X2NvbXBzLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1GQUxTRX0NCg0KIyBEZWZpbmUgbGluZXR5cGVzDQpzZWN0b3JfbGluZXR5cGVzIDwtIGMoIkhvdGVscyIgPSAic29saWQiLCAiUmVzdGF1cmFudHMiID0gImRhc2hlZCIsICJSZXRhaWwgVHJhZGUiID0gImRvdHRlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICJTb2NpYWwgU2VydmljZXMiID0gImRvdGRhc2giLCAiQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIE90aGVyIFJlY3JlYXRpb24iID0gImxvbmdkYXNoIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlBoYXJtYWNldXRpY2FscyIgPSAidHdvZGFzaCIsICJJbnN1cmFuY2UiID0gImRhc2hlZCIsICJQcm9mZXNzaW9uYWwgU2VydmljZXMiID0gInNvbGlkIikNCg0Kc2VjdG9yX2NvbG9ycyA8LSBjKCJIb3RlbHMiID0gIiMxZjc3YjQiLCAiUmVzdGF1cmFudHMiID0gIiNmZjdmMGUiLCAiUmV0YWlsIFRyYWRlIiA9ICIjMmNhMDJjIiwgDQogICAgICAgICAgICAgICAgICAgIlNvY2lhbCBTZXJ2aWNlcyIgPSAiI2Q2MjcyOCIsICJBcnRzLCBFbnRlcnRhaW5tZW50LCBhbmQgT3RoZXIgUmVjcmVhdGlvbiIgPSAiIzk0NjdiZCIsIA0KICAgICAgICAgICAgICAgICAgICJQaGFybWFjZXV0aWNhbHMiID0gIiM4YzU2NGIiLCAiSW5zdXJhbmNlIiA9ICIjZTM3N2MyIiwgIlByb2Zlc3Npb25hbCBTZXJ2aWNlcyIgPSAiIzdmN2Y3ZiIpDQoNCg0KDQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgIGZpbHRlcihzZWN0b3IgJWluJSBjKCJIb3RlbHMiLCAiUmVzdGF1cmFudHMiLCAiUmV0YWlsIFRyYWRlIiwgIlNvY2lhbCBTZXJ2aWNlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICJBcnRzLCBFbnRlcnRhaW5tZW50LCBhbmQgT3RoZXIgUmVjcmVhdGlvbiIsICJQaGFybWFjZXV0aWNhbHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiSW5zdXJhbmNlIiwgIlByb2Zlc3Npb25hbCBTZXJ2aWNlcyIpKSAlPiUNCiAgICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogICAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgICBQcmUuUGFuZGVtaWMuVHJlbmQgPSBzdW0ocHJlZCksIA0KICAgICAgICAgICAgICBwY3RfZGlmZiA9IDEwMCooKEFjdHVhbC1QcmUuUGFuZGVtaWMuVHJlbmQpL1ByZS5QYW5kZW1pYy5UcmVuZCkpICU+JQ0KICAgIGZpbHRlcih5ZWFyID49IDIwMjApICU+JQ0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fbGluZShhZXMoeCA9IGFzLkRhdGUoZGF0ZSksIHk9cGN0X2RpZmYsIGNvbG9yID0gc2VjdG9yLCBsaW5ldHlwZSA9IHNlY3RvcikpKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHNlY3Rvcl9jb2xvcnMpKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gc2VjdG9yX2xpbmV0eXBlcykrDQogICAgeWxhYigiUXVhcnRlcmx5IFRheCBSZXZlbnVlIHZzLiBFeHBlY3RlZCAoJSkiKSsNCiAgICB4bGFiKCJEYXRlIikrDQogICAgbGFicygNCiAgICAgICAgdGl0bGUgPSAiUGhpbGFkZWxwaGlhIFdhZ2UgVGF4IC0gUGVyY2VudGFnZSBTaG9ydGZhbGwgdnMgUHJlLVBhbmRlbWljIFRyZW5kcyIsDQogICAgICAgIHN1YnRpdGxlID0gIkFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMyBEb2xsYXJzLlxuIFRyZW5kIGJhc2VkIG9uIDIwMTQtQ09WSUQgcmVncmVzc2lvbiBjb250cm9sbGluZyBmb3IgeWVhciwgcXVhcnRlciwgc2VjdG9yLiBcblNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSwgQkxTIikrDQogICAgcGxvdFRoZW1lDQoNCmBgYA0KDQpXaHkgaXMgdGhpcyBoYXBwZW5pbmc/IFdhZ2UgdGF4IHJldHVybnMgYXJlIGRvd24gYWNyb3NzIHRoZSBib2FyZCAtIGFuZCB0aGVzZSBraW5kcyBvZiBpbmR1c3RyaWVzIGV4dGVybmFsaXplIGhvc3BpdGFsaXR5IGFjdGl2aXR5LiBUSGUgb25seSB0aGluZ3MgdGhhdCBhcmUgcmVhbGx5ICJiYWNrIiBhcmUgc2VydmljZXMgYW5kIHJldGFpbC4NCg0KVG90YWwgdGF4IHNob3J0ZmFsbHMgKGNvbXBhcmVkIHRvIHByZS1wYW5kZW1pYyB0cmVuZCkgc2luY2UgTWFyY2gsIDIwMjAsIGluIG1pbGxpb25zICgyMDIzIGRvbGxhcnMpDQoNCmBgYHtyIGxvc3Nfc3VtbWFyeSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kd2FnZV90YXhfcmV2ZW51ZV9uZXcgJT4lDQogIGdyb3VwX2J5KGRhdGUsIHNlY3RvciwgeWVhciwgbW9udGgpICU+JSANCiAgc3VtbWFyaXplKEFjdHVhbCA9IHN1bSh0b3RhbCksIA0KICAgICAgICAgICAgUHJlLlBhbmRlbWljLlRyZW5kID0gc3VtKHByZWQpKSAlPiUgDQogIG11dGF0ZShsb3NzID0gQWN0dWFsIC0gUHJlLlBhbmRlbWljLlRyZW5kKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwICYgbW9udGggPj0zIHwgeWVhciA+IDIwMjApICU+JQ0KICBncm91cF9ieShzZWN0b3IpICU+JQ0KICBzdW1tYXJpemUoIkVzdCBMb3NzIChtaWxsaW9ucykiID0gcm91bmQoc3VtKGxvc3MpLzEwMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpICU+JQ0KICBzY3JvbGxfYm94KGhlaWdodCA9ICI0MDBweCIsIHdpZHRoID0gIjEwMCUiKQ0KDQpgYGANCg0KIyAyLiBBbXVzZW1lbnQgVGF4IFJlY2VpcHRzDQoNCkFtdXNlbWVudCB0YXggcmV2ZW51ZXMgc2VlbSB0byBiZSBiYWNrLg0KDQpEYXRhIGZyb20gUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSAtIDYvMTgvMjAyNC4gRGF0YSBhcmUgbW9udGhseSB0aHJvdWdoIEp1bHksIDIwMjMNCg0KU291cmNlOg0KDQpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGhpbGFDb250cm9sbGVyL3BobC1idWRnZXQtZGF0YS9tYWluL3NyYy9waGxfYnVkZ2V0X2RhdGEvZGF0YS9wcm9jZXNzZWQvcmV2ZW51ZS9jaXR5LWNvbGxlY3Rpb25zLmNzdg0KDQoNCmBgYHtyIGxvYWRfYW11c2VtZW50LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gImhpZGUifQ0KYW11c2VtZW50IDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGhpbGFDb250cm9sbGVyL3BobC1idWRnZXQtZGF0YS9tYWluL3NyYy9waGxfYnVkZ2V0X2RhdGEvZGF0YS9wcm9jZXNzZWQvY29sbGVjdGlvbnMvY2l0eS10YXgtY29sbGVjdGlvbnMuY3N2IikgJT4lDQogIGZpbHRlcihuYW1lID09ICJhbXVzZW1lbnQiKSAlPiUNCiAgICBtdXRhdGUoeWVhciA9IHllYXIoeW1kKGRhdGUpKSwNCiAgICAgICAgICAgbW9udGggPSBtb250aCh5bWQoZGF0ZSkpKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gY2FzZV93aGVuKHllYXIgPT0gMjAxNCB+IHRvdGFsICogMS4yOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNSB+IHRvdGFsICogMS4yOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNiB+IHRvdGFsICogMS4yNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxNyB+IHRvdGFsICogMS4yNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOCB+IHRvdGFsICogMS4yMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAxOSB+IHRvdGFsICogMS4xOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMCB+IHRvdGFsICogMS4xOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMSB+IHRvdGFsICogMS4xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMiB+IHRvdGFsICogMS4wMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMyB+IHRvdGFsICogMSkpDQoNCmBgYA0KDQojIyAyLjEuIFRpbWVsaW5lIG9mIEFtdXNlbWVudCBUYXggUmV2ZW51ZXMNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmFtdXNlbWVudCAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lDQogIHN1bW1hcml6ZShzdW0gPSBzdW0odG90YWwpLA0KICAgICAgICAgICAgc3VtID0gcm91bmQoKHN1bS8xMDAwMDAwKSwgZGlnaXRzID0gMikpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT1zdW0pKSsNCiAgeWxhYigiTW9udGhseSBBbXVzZW1lbnQgVGF4IFJldmVudWUgKCQgTWlsbGlvbnMpIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgQW11c2VtZW50IFRheCBSZWNlaXB0cyIsDQogICAgc3VidGl0bGUgPSAiQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIzIERvbGxhcnMuIFNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSIpKw0KICBwbG90VGhlbWUNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KYW11c2VtZW50ICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh0b3RhbCksDQogICAgICAgICAgICBzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2JhcihhZXMoeCA9IHllYXIsIHk9c3VtKSwgc3RhdCA9ICJpZGVudGl0eSIpKw0KICB5bGFiKCJNb250aGx5IEFtdXNlbWVudCBUYXggUmV2ZW51ZSAoJCBNaWxsaW9ucykiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlBoaWxhZGVscGhpYSBBbXVzZW1lbnQgVGF4IFJlY2VpcHRzIiwNCiAgICBzdWJ0aXRsZSA9ICIyMDIzIERhdGEgYXJlIHRocm91Z2ggSnVseS4gQWRqdXN0ZWQgZm9yIGluZmxhdGlvbiB0byAyMDIzIERvbGxhcnMuIFNvdXJjZTogUGhpbGFkZWxwaGlhIENpdHkgQ29udHJvbGxlcidzIE9mZmljZSIpKw0KICBwbG90VGhlbWUNCg0KDQpgYGANCg0KIyA0LiBab25pbmcgYW5kIEFzc2VtYmx5IExpY2Vuc2VzDQoNCkxhc3QgdGltZSwgd2UgY3JlYXRlZCBhIHJlYWxseSBiaWcgcnVuZG93biBvZiBTQU9McyBhbmQgd2hlcmUgcGVvcGxlIHdlcmUgYXBwbHlpbmcgZm9yIHRoZW0gLSB3aGV0aGVyIHRoYXQgd2FzIHRyaWdnZXJpbmcgem9uaW5nIGNoYW5nZXMgYW5kIGNvbXBsaWNhdGluZyB0aGUgcHJvY2Vzcy4gKFRoZSBiaWcgdGFrZWF3YXkgd2FzIHRoYXQgb3BlbmluZyB1cCBDTVgtMi41IHdvdWxkIGRvdWJsZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBwYXJjZWxzLCBhbmQgQ291bmNpbG1lbWJlcnMgdGhvdWdodCB0aGlzIHdhcyBraW5kIG9mIHRvdWdoIHRvIHNlbGwsIGJ1dCB0aGF0IG1heWJlIGNlcnRhaW4gZGlzdHJpY3RzIGl0IHdhcyB3b3J0aCBhIGNoYXQpLg0KDQpUaGlzIHRpbWUgdGhlIGFuYWx5c2lzIGlzIHN0aWxsIHRoZXJlLCBidXQgbm8gbWFqb3IgY2hhbmdlcy4gVGhlcmUncyBzdGlsbCBhIG1hcCBvZiB0aGUgY2l0eS13aWRlIHpvbmluZyBhY2NvcmRpbmcgdG8gd2hlcmUgU0FPTHMgYXJlIHBlcm1pdHRlZC4gSG9wZWZ1bGx5IHRoYXQncyBoZWxwZnVsIGFzIGEgc25hcHNob3QuDQoNClRoZSBiaWcgdGFrZWF3YXkgdGhpcyB5ZWFyIGlzIHRoYXQgdGhlIG51bWJlciBvZiBhY3RpdmUgU0FPTHMgaW4gUGhpbGFkZWxwaGlhIGlzIHN0aWxsIGRlY2xpbmluZyAtIG1vcmUgYXJlIGV4cGlyaW5nIHRoYW4gb3BlbmluZy4gU0FPTHMgYXJlIHN0aWxsIGJlaW5nIG9wZW5lZCBsYXJnZWx5IGluIHBsYWNlcyB3aGVyZSB0aGVyZSBpcyBzaWduaWZpY2FudCB6b25pbmcgcmV2aWV3LCB3aGljaCBicmluZ3MgY291bmNpbCwgUkNPcyBldGMuLCBpbnRvIHBsYXkuDQoNCmBgYHtyIGRsX3pvbmluZywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cyA9ICJoaWRlIn0NCg0Kem9uZXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9vcGVuZGF0YS5hcmNnaXMuY29tL2RhdGFzZXRzLzBiZGIwYjVmMTM3NzRjMDNhYmY4ZGMyZjFhYTAxNjkzXzAuZ2VvanNvbiIpICU+JQ0KICBzdF9hc19zZihjcnMgPSA0MzI2KSAlPiUNCiAgbXV0YXRlKGFzc2VtYmx5X2FsbG93ZWQgPSBpZmVsc2UoTE9OR19DT0RFICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQ01YLTQiLCAiQ01YLTUiLCAiQ0EtMiIsICJJQ01YIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeS1SaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoTE9OR19DT0RFICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkNNWC0yIiwgIkNNWC0yLjUiLCAiQ01YLTMiLCAiSVJNWCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpYWwgRXhjZXB0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IFBlcm1pdHRlZCIgKSkpDQoNCmxpY2Vuc2VzIDwtIHN0X3JlYWQoImh0dHBzOi8vcGhsLmNhcnRvLmNvbS9hcGkvdjIvc3FsP3E9U0VMRUNUKyorRlJPTStidXNpbmVzc19saWNlbnNlcyZmaWxlbmFtZT1idXNpbmVzc19saWNlbnNlcyZmb3JtYXQ9Z2VvanNvbiZza2lwZmllbGRzPWNhcnRvZGJfaWQiKSAlPiUNCiAgc3RfYXNfc2YoY3JzID0gNDMyNikNCg0KYGBgDQojIyA0LjEuIFN1bW1hcnkgb2YgU0FPTC1lbGlnaWJsZSBEaXN0cmljdHMNCg0KQXNzZW1ibHkgaXMgYWxsb3dlZCBieSByaWdodCBpbiBmb3VyIHpvbmluZyBkaXN0cmljdHMsIGFuZCBieSBzcGVjaWFsIGV4Y2VwdGlvbiBpbiBmb3VyIG90aGVycy4NCg0KSGVyZSBhcmUgc29tZSB2ZXJ5IGJhc2ljIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSB0eXBlcyBvZiB6b25lcywgd2l0aCBpbmZvcm1hdGlvbiBzb3VyY2VkIGZyb20gQW5hc3Rhc2lvIExhdyAtIGh0dHA6Ly9waGlsbHl6b25pbmcuY29tLw0KDQoqQnkgUmlnaHQqDQoNCi1DQS0yIC0gQXV0by1vcmllbnRlZCBjb21tZXJjaWFsDQoNCi1DTVgtNCAtIENvbW1lcmNpYWwgTWl4ZWQgVXNlLCBtb3N0bHkgZm91bmQgaW4gQ2VudGVyIENpdHkgb3IgYWxvbmcgbWFqb3IgYXJ0ZXJpYWxzIGxpa2UgQnJvYWQsIE1hcmtldCBvciBDaGVzdG51dCBTdHJlZXRzDQoNCi1DTVgtNSAtIENvbW1lcmNpYWwgTWl4ZWQgVXNlLCBmb3VuZCBpbiB0aGUgY29yZSBvZiBDZW50ZXIgQ2l0eSBvZmZpY2UgZGlzdHJpY3RzDQoNCi1JQ01YIC0gQ29tbWVyY2lhbC9JbmR1c3RyaWFsIHVzZXMgZGVzaWduZWQgYXMgYSBidWZmZXIgYmV0d2VlbiBjb21tZXJjaWFsIGFuZCByZXNpZGVudGlhbCB1c2VzDQoNCipTcGVjaWFsIEV4Y2VwdGlvbioNCg0KLUNNWC0yIC0gTmVpZ2hib3Job29kIGNvbW1lcmNpYWwgY29ycmlkb3IsIG1peGVkIHVzZSAtIGUuZy4gQmFsdGltb3JlIEF2ZW51ZSwgR2VybWFudG93biBBdmVudWUNCg0KLUNNWC0yLjUgLSBDb21tZXJjaWFsIG1peGVkIHVzZSBkZXNpZ25lZCB0byBwcm9tb3RlIHBlZGVzdHJpYW4tZnJpZW5kbHkgdXNlcw0KDQotQ01YLTMgLSBMb3dlciBkZW5zaXR5IGNvbW1lcmNpYWwgbWl4ZWQgdXNlIHRoYW4gQ01YIDQmNSwgZm91bmQgb24gbWFqb3IgY29ycmlkb3JzIGxpa2UgS2Vuc2luZ3RvbiBBdmUsIFNvdXRoIFN0LCBCcm9hZCBzb3V0aCBvZiBXYXNoaW5ndG9uLg0KDQotSVJNWCAtICJMb3cgaW1wYWN0IiBpbmR1c3RyaWFsLCBpbmNsdWRpbmcgYXJ0aXN0IHNwYWNlcw0KDQpgYGB7ciBleHBsb3JlX3pvbmVzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobz1GQUxTRSwgZXZhbCA9IEZBTFNFfQ0Kem9uZXMgJT4lDQogIGFzLmRhdGEuZnJhbWUoKSU+JQ0KICBmaWx0ZXIoTE9OR19DT0RFICVpbiUgYygiQ01YLTQiLCAiQ01YLTUiLCAiQ0EtMiIsICJJQ01YIiwgIkNNWC0yIiwgIkNNWC0yLjUiLCAiQ01YLTMiLCAiSVJNWCIpKSAlPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCwgTE9OR19DT0RFKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKCJQYXJjZWxzIGNpdHktd2lkZSIgPSBuLA0KICAgICAgICAgRGlzdHJpY3QgPSBMT05HX0NPREUpICU+JQ0KICBrYWJsZSAlPiUNCiAga2FibGVfc3R5bGluZygpDQpgYGANCg0KQ2l0eS13aWRlLCByb3VnaGx5IDI2JSBvZiAqY29tbWVyY2lhbCogZGlzdHJpY3RzIChieSBhcmVhKSBhcmUgem9uZWQgZm9yIGFzc2VtYmx5IGJ5IHJpZ2h0LiBNdWNoIG9mIHRoaXMgYXJlYSBpcyBpbiBsYXJnZSBDZW50ZXIgQ2l0eSB0cmFjdHMgd2hlcmUgY3JlYXRpdmUgc3BhY2VzIGFyZSB1bmxpa2VseSB0byBiZSBkZXZlbG9wZWQgZHVlIHRvIGNvc3Qgb3IgY29uc3RyYWludHMgb2YgdGhlIGxhbmQuDQoNCmBgYHtyIHBjdF9jb21tZXJjaWFsX3Byb3BzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobz1GQUxTRX0NCnpvbmVzICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChaT05JTkdHUk9VUCwgIkNvbW1lcmNpYWwiKSA9PSBUUlVFKSAlPiUNCiAgc3RfdHJhbnNmb3JtKDIyNzIpICU+JQ0KICBtdXRhdGUoYXJlYSA9IHN0X2FyZWEoLikpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCklPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCkgJT4lDQogIHN1bW1hcml6ZShzdW1fYXJlYSA9IHN1bShhcmVhKSkgJT4lDQogICNyZW5hbWUobl9wYXJjZWxzID0gbikgJT4lDQogIG11dGF0ZShQY3QgPSByb3VuZCgxMDAqKHN1bV9hcmVhIC8gc3VtKHN1bV9hcmVhKSksIDIpKSAlPiUNCiAgI3JlbmFtZSgiUGFyY2VscyBDaXR5LVdpZGUiID0gbl9wYXJjZWxzKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpDQpgYGANCg0KDQoNCiMjIDQuMi4gQ2l0eS13aWRlIHpvbmluZyBleGFtaW5hdGlvbg0KDQpUaGUgbWFqb3JpdHkgb2YgYXJlYXMgem9uZWQgZm9yIGFzc2VtYmx5IGJ5LXJpZ2h0IGFyZSBpbiBDZW50ZXIgQ2l0eS4gVGhpcyBpcyAqbm90KiB3aGVyZSBtb3N0IGRldmVsb3BtZW50IG9mIGNyZWF0aXZlIGVudGVydGFpbm1lbnQgaXMgdGFraW5nIHBsYWNlLg0KDQpUYWtlIGEgbG9vayBhdCBkaXN0cmljdHMgb3V0c2lkZSBDZW50ZXIgQ2l0eSBsaWtlIEZpc2h0b3duIC0gYnktcmlnaHQgU0FPTCBpcyBub3QgcmVhbGx5IGFsbG93ZWQgYnktcmlnaHQgYW55d2hlcmUuDQoNCmBgYHtyIG1hcF9leGNlcHRpb25zLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9IDh9DQptYXB2aWV3KHpvbmVzICU+JQ0KICAgICAgICAgIGZpbHRlcihhc3NlbWJseV9hbGxvd2VkICVpbiUgYygiU3BlY2lhbCBFeGNlcHRpb24iLCAiQnktUmlnaHQiKSkgJT4lDQogICAgICAgICAgbXV0YXRlKExPTkdfQ09ERSA9IGNhc2Vfd2hlbihMT05HX0NPREUgPT0gIkNBLTIiIH4gIkJ5LVJpZ2h0IENBLTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJDTVgtNCIgfiAiQnktUmlnaHQgQ01YLTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJDTVgtNSIgfiAiQnktUmlnaHQgQ01YLTUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJJQ01YIiB+ICJCeS1SaWdodCBJQ01YIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiQ01YLTIiIH4gIlNwZWMgRXhlY3B0IENNWC0yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiQ01YLTIuNSIgfiAiU3BlYyBFeGVjcHQgQ01YLTIuNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIkNNWC0zIiB+ICJTcGVjIEV4ZWNwdCBDTVgtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIklSTVgiIH4gIlNwZWMgRXhlY3B0IElSTVgiKSksDQogICAgICAgIHpjb2wgPSAiTE9OR19DT0RFIiwgY29sLnJlZ2lvbnM9bGlzdCgiI2ZmZmZiMiIsICIjZmVjYzVjIiwgIiNmZDhkM2MiLCAiI2UzMWExYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2VkZjhmYiIsICIjYjNjZGUzIiwgIiM4Yzk2YzYiLCAiIzg4NDE5ZCIpLA0KICAgICAgICBjb2wgPSBsaXN0KCJ0cmFuc3BhcmVudCIpLA0KICAgICAgICBsYXllci5uYW1lID0gIlpvbmluZyBEaXN0cmljdHMiKQ0KDQpgYGANCg0KDQojIyA0LjMuIFNBT0wgaXNzdWFuY2UgdGltZWxpbmUNCg0KVGhlcmUgYXJlIGN1cnJlbnRseSAxMTMgU0FPTHMgYWN0aXZlIGluIFBoaWxseS4gT25lIG1ham9yIG5vdGUgLSBpdCBzZWVtcyB0byBtZSB0aGF0IHRoZSByZWdpc3RyYXRpb24gb2YgbGljZW5zZXMgaW4gdGhlIE9wZW5EYXRhUGhpbGx5IHN5c3RlbSBpcyBub3QgZW50aXJlbHkgY3VycmVudCwgc28gdGhlc2UgbnVtYmVycyBhcmUgcHJvYmFibHkgb2ZmIGJ5IGEgbGl0dGxlIGJpdCAtIGRvbid0IG1ha2UgdG9vIG11Y2ggb2Ygc21hbGwgY2hhbmdlcyBvciBkaWZmZXJlbmNlcyBmcm9tIHllYXIgdG8geWVhci4NCg0KVmVyeSBmZXcgU0FPTHMgYXJlIGlzc3VlZCBpbiBQaGlsbHksIGFuZCBlc3BlY2lhbGx5IGZldyB0aGUgbGFzdCBmZXcgeWVhcnMuIFRoZSBmb2xsb3dpbmcgY2hhcnQgc2hvd3MgdGhlIGRhdGUgd2hlbiBTQU9MJ3Mgd2VyZSBpc3N1ZWQuIDIwMDYgcHJvYmFibHkgaGFzIGRhdGEgaW5mbGF0ZWQgYnkgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQta2VlcGluZyBwZXJpb2QgZm9yIHRoZXNlIGRhdGEuDQoNCmBgYHtyIGxpY2Vuc2VfdGltZWxpbmUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIpICU+JQ0KICBtdXRhdGUoeWVhcl9vcGVuZWQgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9vcGVuZWQpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBuLCB4ID0geWVhcl9vcGVuZWQpLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlPSJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIEFjdGl2ZSBEYXRlcyIsDQogICAgICAgc3VidGl0bGU9ICJEYXRhIHRocm91Z2ggSnVuZSwgMjAyNC4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucyIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBMaWNlbnNlcyBBY3RpdmF0ZWQiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpUaGUgbGFzdCBmZXcgeWVhcnMgd2UgYXJlIHN0aWxsIHNlZWluZyBtb3JlIGluYWN0aXZhdGlvbnMgdGhhbiBhY3RpdmF0aW9ucyBvZiBTQU9Mcw0KDQpgYGB7ciBsaWNlbnNlX3RpbWVsaW5lX2luYWN0aXZlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyX2Nsb3NlZCA9IHllYXIoYXMuRGF0ZShleHBpcmF0aW9uZGF0ZSkpKSAlPiUNCiAgZmlsdGVyKHllYXJfY2xvc2VkIDwgMjAyNSkgJT4lDQogIGdyb3VwX2J5KHllYXJfY2xvc2VkKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gbiwgeCA9IHllYXJfY2xvc2VkKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kgTGljZW5zZSBFeHBpcmF0aW9uIERhdGVzIiwNCiAgICAgICBzdWJ0aXRsZT0gIkRhdGEgdGhyb3VnaCBKdW5lLCAyMDI0LiBTb3VyY2U6IFBoaWxhZGVscGhpYSBEZXB0LiBPZiBMaWNlbnNlcyAmIEluc3BlY3Rpb25zIiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iTnVtYmVyIG9mIExpY2Vuc2VzIEluYWN0aXZhdGVkLCIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNCmBgYHtyIGxpY2Vuc2VfdGltZWxpbmVfaW5hY3RpdmUzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcihhcy5EYXRlKGV4cGlyYXRpb25kYXRlKSkpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICBtdXRhdGUoQWN0aW9uID0gIkV4cGlyZWQiKSAlPiUNCiAgcmJpbmQoLiwgDQogIGxpY2Vuc2VzICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoYXMuRGF0ZShpbml0aWFsaXNzdWVkYXRlKSkpICU+JQ0KICAgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiKSAlPiUNCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICBtdXRhdGUoQWN0aW9uID0gIkFjdGl2YXRlZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIgPCAyMDI1ICYgeWVhciA+IDIwMDYpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gbiwgeCA9IHllYXIsIGNvbG9yID0gQWN0aW9uKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kgTGljZW5zZSBJc3N1YW5jZSBhbmQgQ2xvc3VyZSIsDQogICAgICAgc3VidGl0bGU9ICJEYXRhIHRocm91Z2ggSnVuZSwgMjAyNC4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucyIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBMaWNlbnNlcyIpKw0KICBwbG90VGhlbWUNCmBgYA0KDQpgYGB7ciBsaWNlbnNlX3RpbWVsaW5lX2luYWN0aXZlNCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpY2Vuc2VzICU+JQ0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgIT0gIkFjdGl2ZSIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoYXMuRGF0ZShleHBpcmF0aW9uZGF0ZSkpKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZShpbmFjdGl2YXRlZCA9IG4pICU+JQ0KICBmdWxsX2pvaW4oLiwgDQogIGxpY2Vuc2VzICU+JQ0KICAgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiKSAlPiUNCiAgbXV0YXRlKHllYXIgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICByZW5hbWUoYWN0aXZhdGVkID0gbikpICU+JQ0KICBhcnJhbmdlKHllYXIpICU+JQ0KICBtdXRhdGUoaW5hY3RpdmF0ZWQgPSBpZmVsc2UoaXMubmEoaW5hY3RpdmF0ZWQpID09IFRSVUUsIDAsIGluYWN0aXZhdGVkKSwNCiAgICB5ZWFybHlfbmV0ID0gYWN0aXZhdGVkIC0gaW5hY3RpdmF0ZWQsDQogICAgICAgICBhY3RpdmVfbGljZW5zZXMgPSBjdW1zdW0oeWVhcmx5X25ldCkpICU+JQ0KICBmaWx0ZXIoeWVhciA+MjAwOSAmIHllYXIgPCAyMDI1KSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fYmFyKGFlcyh5ID0gYWN0aXZlX2xpY2Vuc2VzLCB4ID0geWVhciksIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGU9IkFjdGl2ZSBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlcyIsDQogICAgICAgc3VidGl0bGU9ICJBY3RpdmF0aW9ucyBNaW51cyBFeHBpcmF0aW9ucyBCeSBZZWFyIGZyb20gUmVjb3JkcyAxLzIwMDUgLSA2LzIwMjQuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQojIyA0LjQuIFNBT0xzIGFuZCBCeS1SaWdodCBab25pbmcNCg0KQW1vbmcgMTEzIGFjdGl2ZSBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlcywgb25seSAyNyAoMjQlKSB3ZXJlIHBlcm1pdHRlZCBieSByaWdodCBpbiB0aGUgem9uZXMgd2hlcmUgdGhleSB3ZXJlIGNyZWF0ZWQuIFRoaXMgaXMgbG93ZXIgdGhhbiBvdXIgbGFzdCBhc3Nlc3NtZW50LCB3aGVuIGl0IHdhcyAyOCUuDQoNCmBgYHtyIGxpY2Vuc2VzX2FuZF96b25lczEsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGljZW5zZXMgJT4lIA0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgc3Rfam9pbiguLCB6b25lcyAlPiUNCiAgICAgICAgICAgIHN0X21ha2VfdmFsaWQoKSkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQsIExPTkdfQ09ERSkgJT4lIA0KICB0YWxseSgpICU+JQ0KICByZW5hbWUobl9saWNlbnNlcyA9IG4pICU+JQ0KICBsZWZ0X2pvaW4oLiwgem9uZXMgJT4lDQogICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoTE9OR19DT0RFKSAlPiUNCiAgICAgICAgICAgICAgdGFsbHkoKSAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKCB0b3RhbF96b25lX3BhcmNlbHMgPSBuKSkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQsIExPTkdfQ09ERSkgJT4lDQogIHN1bW1hcml6ZShuX2xpY2Vuc2VzID0gc3VtKG5fbGljZW5zZXMpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUocGN0ID0gcm91bmQoMTAwKihuX2xpY2Vuc2VzIC8gc3VtKG5fbGljZW5zZXMpKSwyKSkgJT4lDQogIGthYmxlKCkgICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkgJT4lDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjQwMHB4Iiwgd2lkdGggPSAiMTAwJSIpDQogIA0KYGBgDQoNCg0KDQoNCmBgYHtyIGxpY2Vuc2VzX2FuZF96b25lczIsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGljZW5zZXMgJT4lIA0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgc3Rfam9pbiguLCB6b25lcyAlPiUNCiAgICAgICAgICAgIHN0X21ha2VfdmFsaWQoKSkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQsIExPTkdfQ09ERSkgJT4lIA0KICB0YWxseSgpICU+JQ0KICByZW5hbWUobl9saWNlbnNlcyA9IG4pICU+JQ0KICBsZWZ0X2pvaW4oLiwgem9uZXMgJT4lDQogICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoTE9OR19DT0RFKSAlPiUNCiAgICAgICAgICAgICAgdGFsbHkoKSAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKCB0b3RhbF96b25lX3BhcmNlbHMgPSBuKSkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQpICU+JQ0KICBzdW1tYXJpemUobl9saWNlbnNlcyA9IHN1bShuX2xpY2Vuc2VzKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKHBjdCA9IHJvdW5kKDEwMCoobl9saWNlbnNlcyAvIHN1bShuX2xpY2Vuc2VzKSksMikpICU+JQ0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCiAgDQpgYGANCg0KIyMgNC41LiBTQU9MIG1hcA0KDQpgYGB7ciBzYW9sX21hcCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KbGljZW5zZXMgJT4lIA0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JQ0KICBzZWxlY3QoYWRkcmVzcywgemlwLCBsaWNlbnNlbnVtLCBvcGFfYWNjb3VudF9udW0sIG9wYV9vd25lciwgbGljZW5zZXR5cGUsIGxpY2Vuc2VzdGF0dXMsDQogICAgICAgICBidXNpbmVzc19uYW1lLCBidXNpbmVzc19tYWlsaW5nX2FkZHJlc3MsIGxlZ2FsbmFtZSwgbGVnYWxlbnRpdHl0eXBlKSAlPiUNCiAgbWFwdmlldygpDQoNCmBgYA0KDQojIDUuIEFtdXNlbWVudCBMaWNlbnNlcw0KDQpIZXJlIGlzIGFuIGFjdGl2YXRpb24vaW5hY3RpdmF0aW9uIHRpbWVsaW5lIGZvciBhbXVzZW1lbnQgbGljZW5zZXMgLSB0aGVzZSBkYXRhIGFwcGVhciB0byBzdGFydCBiZWluZyByZWxpYWJsZSBpbiBhYm91dCAyMDE1IC0gaW4gMjAxNCwgaHVuZHJlZHMgb2YgbGljZW5zZXMgd2VyZSBhZGRlZCB0byB0aGUgcmVnaXN0ZXIgKHBvc3NpYmx5IGR1ZSB0byBhIHJlY29yZGluZyBzcHJpbnQpLg0KDQpgYGB7ciBhbXVzZW1lbnRfbGljZW5zZV90aW1lbGluZV9pbmFjdGl2ZTMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJBbXVzZW1lbnQiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyAhPSAiQWN0aXZlIikgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcihhcy5EYXRlKGV4cGlyYXRpb25kYXRlKSkpICU+JQ0KICBhcy5kYXRhLmZyYW1lICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKGluYWN0aXZhdGVkID0gbikgJT4lDQogIGZ1bGxfam9pbiguLCANCiAgbGljZW5zZXMgJT4lDQogICAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJBbXVzZW1lbnQiKSAlPiUNCiAgbXV0YXRlKHllYXIgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICByZW5hbWUoYWN0aXZhdGVkID0gbikpICU+JQ0KICBhcnJhbmdlKHllYXIpICU+JQ0KICBtdXRhdGUoaW5hY3RpdmF0ZWQgPSBpZmVsc2UoaXMubmEoaW5hY3RpdmF0ZWQpID09IFRSVUUsIDAsIGluYWN0aXZhdGVkKSwNCiAgICB5ZWFybHlfbmV0ID0gYWN0aXZhdGVkIC0gaW5hY3RpdmF0ZWQsDQogICAgICAgICBhY3RpdmVfbGljZW5zZXMgPSBjdW1zdW0oeWVhcmx5X25ldCkpICU+JQ0KICBmaWx0ZXIoeWVhciA+MjAwNyApICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9iYXIoYWVzKHkgPSBhY3RpdmVfbGljZW5zZXMsIHggPSB5ZWFyKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iQWN0aXZlIEFtdXNlbWVudCBMaWNlbnNlcyIsDQogICAgICAgc3VidGl0bGU9ICJBY3RpdmF0aW9ucyBNaW51cyBFeHBpcmF0aW9ucyBCeSBZZWFyIGZyb20gUmVjb3JkcyAxLzIwMDUgLSA2LzIwMjQuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQojIyA1LjEuIEFtdXNlbWVudCBMaWNlbnNlIE1hcA0KDQpgYGB7ciBhbXVzZW1lbnRfbWFwLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWNlbnNlcyAlPiUgDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiQW11c2VtZW50IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JQ0KICBzZWxlY3QoYWRkcmVzcywgemlwLCBsaWNlbnNlbnVtLCBvcGFfYWNjb3VudF9udW0sIG9wYV9vd25lciwgbGljZW5zZXR5cGUsIGxpY2Vuc2VzdGF0dXMsDQogICAgICAgICBidXNpbmVzc19uYW1lLCBidXNpbmVzc19tYWlsaW5nX2FkZHJlc3MsIGxlZ2FsbmFtZSwgbGVnYWxlbnRpdHl0eXBlKSAlPiUNCiAgbWFwdmlldygpDQoNCmBgYA0KDQojIDYuIFJlc3RhdXJhbnQgTGljZW5zZXMNCg0KTmV3IEFjdGl2YXRpb25zIGFyZSBhdCBhIHJlbGF0aXZlbHkgZ29vZCBsZXZlbCBmb3IgcmVzdGF1cmFudHMgLSB0aGV5IHN1cnByaXNpbmdseSBzdGF5ZWQgY29uc2lzdGVudCB0aHJvdWdoIENPVklEIGFuZCBoYXZlbid0IHNsb3dlZCBkb3duLiBOb3RlIHRoZXJlIGlzIHNvbWUgYWRtaW5pc3RyYXRpb24tcmVsYXRlZCBidW1wIGluIDIwMDQvMDUvMDYgd2hlcmUgcmVjb3JkcyB3ZXJlIGFkZGVkIHRvIHRoZSBkYXRhYmFzZSB3aXRoIHRoYXQgYXMgdGhlICJhY3RpdmF0aW9uIiB5ZWFyDQoNCmBgYHtyIHJlc3RfbGljZW5zZV90aW1lbGluZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpY2Vuc2VzICU+JQ0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIkZvb2QgRXN0YWJsaXNobWVudCwgUmV0YWlsIFBlcm1hbmVudCBMb2NhdGlvbiIpICU+JQ0KICBtdXRhdGUoeWVhcl9vcGVuZWQgPSB5ZWFyKGFzLkRhdGUoaW5pdGlhbGlzc3VlZGF0ZSkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9vcGVuZWQpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBuLCB4ID0geWVhcl9vcGVuZWQpLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlPSJGb29kIEVzdGFibGlzaG1lbnQsIFJldGFpbCBQZXJtYW5lbnQgTG9jYXRpb24gTGljZW5zZSBBY3RpdmUgRGF0ZXMiLA0KICAgICAgIHN1YnRpdGxlPSAiRGF0YSB0aHJvdWdoIEp1bmUsIDIwMjQuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMgQWN0aXZhdGVkIikrDQogIHBsb3RUaGVtZQ0KDQpgYGANCg0KQWN0aXZlIExpY2Vuc2VzIChBY3RpdmUgbWludXMgZXhwaXJpbmcpDQoNCjIwMjQgaGFzIGJlZW4gYSB2ZXJ5IGJpZyB5ZWFyIGFscmVhZHkgLSBhbG1vc3QgYXQgMjAyMyBudW1iZXJzIHRocm91Z2ggaGFsZiBhIHllYXIgKGlzIHRoaXMgYSByZWNvcmQta2VlcGluZyBnbGl0Y2g/KQ0KDQpgYGB7ciByZXN0YXVyYW50X2xpY2Vuc2VfdGltZWxpbmVfaW5hY3RpdmUzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiRm9vZCBFc3RhYmxpc2htZW50LCBSZXRhaWwgUGVybWFuZW50IExvY2F0aW9uIiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgIT0gIkFjdGl2ZSIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHllYXIoYXMuRGF0ZShleHBpcmF0aW9uZGF0ZSkpKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZShpbmFjdGl2YXRlZCA9IG4pICU+JQ0KICBmdWxsX2pvaW4oLiwgDQogIGxpY2Vuc2VzICU+JQ0KICAgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiRm9vZCBFc3RhYmxpc2htZW50LCBSZXRhaWwgUGVybWFuZW50IExvY2F0aW9uIikgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcihhcy5EYXRlKGluaXRpYWxpc3N1ZWRhdGUpKSkgJT4lDQogICAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgcmVuYW1lKGFjdGl2YXRlZCA9IG4pKSAlPiUNCiAgYXJyYW5nZSh5ZWFyKSAlPiUNCiAgbXV0YXRlKGluYWN0aXZhdGVkID0gaWZlbHNlKGlzLm5hKGluYWN0aXZhdGVkKSA9PSBUUlVFLCAwLCBpbmFjdGl2YXRlZCksDQogICAgeWVhcmx5X25ldCA9IGFjdGl2YXRlZCAtIGluYWN0aXZhdGVkLA0KICAgICAgICAgYWN0aXZlX2xpY2Vuc2VzID0gY3Vtc3VtKHllYXJseV9uZXQpKSAlPiUNCiAgZmlsdGVyKHllYXIgPjIwMDcgKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fYmFyKGFlcyh5ID0gYWN0aXZlX2xpY2Vuc2VzLCB4ID0geWVhciksIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGU9IkFjdGl2ZSBQZXJtZW5hbnQgUmVzdGF1cmFudCBMaWNlbnNlcyIsDQogICAgICAgc3VidGl0bGU9ICJBY3RpdmF0aW9ucyBNaW51cyBFeHBpcmF0aW9ucyBCeSBZZWFyIGZyb20gUmVjb3JkcyAxLzIwMDUgLSA2LzIwMjQuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQoNCiMgNy4gRmlyZWFybSBJbmNpZGVudHMgYXQgTmlnaHQgaW4gUGhpbGFkZWxwaGlhDQoNClRoZXJlIGlzIG9uZ29pbmcgY29uY2VybiBhYm91dCBndW4gY3JpbWUgaW4gUGhpbGFkZWxwaGlhLCBidXQgb3ZlcmFsbCBudW1iZXJzIG9mIGluY2lkZW50cyBhcmUgZG93biBmcm9tIGEgaGlnaCBpbiAyMDIxLiBbQWNjb3JkaW5nIHRvIEZCSSdzIHVuaWZvcm0gY3JpbWUgcmVwb3J0XShodHRwczovL2NyaW1lLWRhdGEtZXhwbG9yZXIuYXBwLmNsb3VkLmdvdi9wYWdlcy9leHBsb3Jlci9jcmltZS9jcmltZS10cmVuZCksIG5hdGlvbmFsIHJhdGVzIG9mIHZpb2xlbnQgY3JpbWUgYXJlIGRvd24gc3Vic3RhbnRpYWxseSBmcm9tIHBlYWsgcmVjb3JkZWQgbGV2ZWxzIGluIHRoZSAxOTkwcy4NCg0KVGhpcyBzZWN0aW9uIGFuYWx5emVzIFtQaGlsYWRlbHBoaWEgUG9saWNlIERlcGFydG1lbnQgKFBQRCkgZmlyZWFybSBpbmNpZGVudCByZXBvcnRzXShodHRwczovL3d3dy5vcGVuZGF0YXBoaWxseS5vcmcvZGF0YXNldC9jcmltZS1pbmNpZGVudHMpIGZyb20gSmFudWFyeSwgMjAxNyB0byBKdW5lLCAyMDI0IGluIHJlbGF0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBDb21tZXJjZSBEZXB0LiBkZXNpZ25hdGVkIFtjb21tZXJjaWFsIGNvcnJpZG9yc11odHRwczovL3d3dy5vcGVuZGF0YXBoaWxseS5vcmcvZGF0YXNldC9jb21tZXJjaWFsLWNvcnJpZG9ycywgYW5kIHRoZSBsb2NhdGlvbiBvZiBbZm9vZCBzZXJ2aWNlLCBzaWRld2FsayBjYWZlLCBzcGVjaWFsIGFzc2VtYmx5IG9jY3VwYW5jeSwgYW5kIGVudGVydGFpbm1lbnQgbGljZW5zZXNdKGh0dHBzOi8vd3d3Lm9wZW5kYXRhcGhpbGx5Lm9yZy9kYXRhc2V0L2xpY2Vuc2VzLWFuZC1pbnNwZWN0aW9ucy1idXNpbmVzcy1saWNlbnNlcykuIFdlIGRvIG5vdCBoYXZlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHdoZW4gc3BlY2lmaWMgZXN0YWJsaXNobWVudHMgb3BlbiBvciBjbG9zZS4NCg0KS2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgYXJlIHJlcG9ydGVkIGluY2lkZW50cyAtIHN1YmplY3QgdG8gYmlhcyBpbiBvYnNlcnZhdGlvbiwgcmVwb3J0aW5nLCBhbmQgY2xhc3NpZmljYXRpb24uDQoNClRoZSBudW1iZXIgb2YgaW5jaWRlbnRzIGluIGNvcnJpZG9ycyBpcyB0cmVuZGluZyBkb3duIGFsb25nIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjaXR5LiBUaGUgcHJvcG9ydGlvbiBvZiBpbmNpZGVudHMgaW4gY29ycmlkb3JzIGlzIHNpbWlsYXIgdG8gd2hhdCB3ZSBzYXcgaW4gMjAyMS0yLg0KDQpUaGUgbWFqb3IgdGFrZWF3YXlzIGZyb20gb3VyIGFuYWx5c2lzIGFyZSBhcyBmb2xsb3dzOg0KDQoxLiBGaXJlYXJtIGluY2lkZW50cyBhcmUgZGVjbGluaW5nIGZvciB0aGUgY2l0eSBhcyBhIHdob2xlIGFmdGVyIGEgcGVhayBpbiAyMDIxLiBUaGVyZSBpcyBhIGh1Z2UgZHJvcCBpbiBsYXRlIDIwMjMsIG1vc3RseSBhIGRlY3JlYXNlIGluIHJvYmJlcmllcyB3aXRoIGZpcmVhcm1zLg0KDQoyLiBNb3N0IGluY2lkZW50cyBoYXBwZW4gYXQgbmlnaHQsIGJldHdlZW4gYXBwcm94aW1hdGVseSAxMVBNIGFuZCAxQU0uIFRoZSBwcm9wb3J0aW9uIG9mIGluY2lkZW50cyBoYXBwZW5pbmcgYXQgZGlmZmVyZW50IGhvdXJzIG9mIHRoZSBkYXkgaXMgcHJldHR5IHN0ZWFkeSBvdmVyIHRpbWUuDQoNCjMuIEd1biBjcmltZSBhdCBuaWdodCBtb3N0bHkgaGFwcGVucyBhd2F5IGZyb20gZXN0YWJsaXNobWVudHMgb3IgY29tbWVyY2lhbCBjb3JyaWRvcnMsIGFuZCBtb3N0bHkgY29uY2VudHJhdGVkIGluIG5laWdoYm9yaG9vZHMgd2l0aCBoaWdoIHZvbHVtZXMgb2YgaW5jaWRlbnRzLg0KDQo0LiBJZiB5b3UgYXJlIG5lYXIgYSBsaWNlbnNlZCBlc3RhYmxpc2htZW50IGF0IG5pZ2h0IGluIGEgcGxhY2Ugd2l0aCByZWxhdGl2ZWx5IGxvdyBndW4gY3JpbWUsIHlvdSBhcmUgbXVjaCwgbXVjaCBsZXNzIGxpa2VseSB0byBiZSBleHBvc2VkIHRvIGFuIGluY2lkZW50IHRoYW4gaWYgeW91IGFyZSBlbHNld2hlcmUuDQoNCjUuIFNvbWUgb2YgdGhlIGhpZ2hlc3QgdHJhZmZpYyBsb2NhbCBuaWdodGxpZmUgY29ycmlkb3JzIGluIENDIGFuZCBuZWFyYnkgaGF2ZSBjb21wYXJhdGl2ZWx5IGxvdyBmcmVxdWVuY2llcyBvZiBpbmNpZGVudHMgY29tcGFyZWQgdG8gZXhwZWN0ZWQuDQoNCjYuIFRoZXJlIGFyZSBpc3N1ZXMgd2l0aCBzb21lIG9mIHRoZSBrZXkgdHJhbnNpdCBjb3JyaWRvcnMgaW4gV2VzdCwgTm9ydGgsIGxvd2VyIE5vcnRoZWFzdCAtIHRoZXNlIGFyZSBncmVhdCBsb2NhdGlvbnMgZm9yIG5pZ2h0bGlmZSBidXQgdGhlcmUgYXJlIHNpZ25pZmljYW50IHByb2JsZW1zIHdpdGggdmlvbGVuY2UuDQoNCmBgYHtyIGxvYWRfY3JpbWVfZGF0YSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICJoaWRlIn0NCiMgaHR0cHM6Ly9jaXR5b2ZwaGlsYWRlbHBoaWEuZ2l0aHViLmlvL2NhcnRvLWFwaS1leHBsb3Jlci8jaW5jaWRlbnRzX3BhcnQxX3BhcnQyDQojIEphbiAxLCAyMDE3IHRvIEp1bmUgMSwgMjAyNA0KDQojIFRoZSBxdWVyaWVzIGFyZSBkb25lIGJ5IHllYXIgYmVjYXVzZSBpdCdzIGNydXNoaW5nIHRoZSBBUEkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDE3LTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMTctMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDE3IDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDE4LTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMTgtMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDE4IDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDE5LTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMTktMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDE5IDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDIwLTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMjAtMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDIwIDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDIxLTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMjEtMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDIxIDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDIyLTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMjItMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDIyIDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDIzLTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMjMtMTItMzEnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDIzIDwtIHJlYWQuY3N2KHVybCkNCg0KIyBVUkwgZW5jb2RlIHRoZSBxdWVyeQ0KcXVlcnkgPC0gVVJMZW5jb2RlKCJTRUxFQ1QgKiwgU1RfWSh0aGVfZ2VvbSkgQVMgbGF0LCBTVF9YKHRoZV9nZW9tKSBBUyBsbmcgRlJPTSBpbmNpZGVudHNfcGFydDFfcGFydDIgV0hFUkUgZGlzcGF0Y2hfZGF0ZV90aW1lID49ICcyMDI0LTAxLTAxJyBBTkQgZGlzcGF0Y2hfZGF0ZV90aW1lIDwgJzIwMjQtMDYtMzAnIikNCg0KIyBDb25zdHJ1Y3QgdGhlIGZ1bGwgVVJMDQp1cmwgPC0gcGFzdGUwKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9maWxlbmFtZT1pbmNpZGVudHNfcGFydDFfcGFydDImZm9ybWF0PWNzdiZxPSIsIHF1ZXJ5KQ0KDQojIFJlYWQgdGhlIGRhdGENCnBoaWxhQ3JpbWUyMDI0IDwtIHJlYWQuY3N2KHVybCkNCg0KI3BoaWxhQ3JpbWUgPC0gcmVhZC5jc3YoImh0dHBzOi8vcGhsLmNhcnRvLmNvbS9hcGkvdjIvc3FsP2ZpbGVuYW1lPWluY2lkZW50c19wYXJ0MV9wYXJ0MiZmb3JtYXQ9Y3N2JnE9U0VMRUNUJTIwKiUyMCwlMjBTVF9ZKHRoZV9nZW9tKSUyMEFTJTIwbGF0LCUyMFNUX1godGhlX2dlb20pJTIwQVMlMjBsbmclMjBGUk9NJTIwaW5jaWRlbnRzX3BhcnQxX3BhcnQyJTIwV0hFUkUlMjBkaXNwYXRjaF9kYXRlX3RpbWUlMjAlM0U9JTIwJTI3MjAxNy0wMS0wMSUyNyUyMEFORCUyMGRpc3BhdGNoX2RhdGVfdGltZSUyMCUzQyUyMCUyNzIwMjQtMDYtMDElMjciKQ0KDQojIEtlZXAgb25seSB2aW9sZW50IGNyaW1lIHR5cGVzLCBmaXggdHlwb3MgaW4gaG9taWNpZGUgZGF0YSBlbnRyeSwNCiMgQ3JlYXRlIHRpbWUgdmFyaWFibGVzDQojIEZpbHRlciBvdXQgZGF0YSB3aXRoIGJhZCBnZW9tZXRyeSBpbmZvcm1hdGlvbg0KDQpwaGlsYUNyaW1lIDwtIHBoaWxhQ3JpbWUyMDE3ICU+JQ0KICByYmluZCguLCBwaGlsYUNyaW1lMjAxOCkgJT4lDQogIHJiaW5kKC4sIHBoaWxhQ3JpbWUyMDE5KSAlPiUNCiAgcmJpbmQoLiwgcGhpbGFDcmltZTIwMjApICU+JQ0KICByYmluZCguLCBwaGlsYUNyaW1lMjAyMSkgJT4lDQogIHJiaW5kKC4sIHBoaWxhQ3JpbWUyMDIyKSAlPiUNCiAgcmJpbmQoLiwgcGhpbGFDcmltZTIwMjMpICU+JQ0KICByYmluZCguLCBwaGlsYUNyaW1lMjAyNCkNCg0KdmlvbGVudENyaW1lIDwtIHBoaWxhQ3JpbWUgJT4lIA0KICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJPdGhlciBBc3NhdWx0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlZnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWdncmF2YXRlZCBBc3NhdWx0IE5vIEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBObyBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFwZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgU2V4IE9mZmVuc2VzIChOb3QgQ29tbWVyY2lhbGl6ZWQiKSkgJT4lDQogIG11dGF0ZSh0ZXh0X2dlbmVyYWxfY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRleHRfZ2VuZXJhbF9jb2RlLCAiSG9taWNpZGUiKSA9PSBUUlVFLA0KICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCB0ZXh0X2dlbmVyYWxfY29kZSkpICU+JQ0KICBtdXRhdGUoaW50ZXJ2YWw2MCA9IGZsb29yX2RhdGUoeW1kKGRpc3BhdGNoX2RhdGUpLCB1bml0ID0gImhvdXIiKSwNCiAgICAgICAgIHdlZWsgPSB3ZWVrKGludGVydmFsNjApLA0KICAgICAgICAgbW9udGggPSBtb250aChpbnRlcnZhbDYwKSwNCiAgICAgICAgIGRvdHcgPSB3ZGF5KGludGVydmFsNjAsIGxhYmVsPVRSVUUpLA0KICAgICAgICAgeWVhciA9IHllYXIoaW50ZXJ2YWw2MCksDQogICAgICAgICBob3VyID0gaG91cihobXMoZGlzcGF0Y2hfdGltZSkpKSAlPiUNCiAgbXV0YXRlKGFmdGVyX3NpeCA9IGlmZWxzZShob3VyID4gMTcgfCBob3VyIDwgNywgIjZQTSAtIDZBTSIsICI2QU0gLSA2UE0iKSkNCg0KIyBTcGF0aWFsaXplIGRhdGEsIGRyb3AgZGF0YSB3aXRob3V0IHNwYXRpYWwgaW5mbw0KDQp2aW9sZW50Q3JpbWVfc2hwIDwtIHZpb2xlbnRDcmltZSAlPiUNCiAgZmlsdGVyKHBvaW50X3kgPiAxLA0KICAgICAgICAgcG9pbnRfeCA+IC03NiwNCiAgICAgICAgIHBvaW50X3ggPCAtNzMpICU+JQ0KICBzdF9hc19zZihjb29yZHMgPSBjKCJsbmciLCAibGF0IiksIGNycyA9IDQzMjYpICU+JQ0KICBzdF90cmFuc2Zvcm0oMjI3MikNCg0KIyBUYWtlIHRoZSBsaWNlbnNlcyBmb3IgcmVzdGF1cmFudHMsIGFtdXNlbWVudCwgYXNzZW1ibHksIGZvb2QgZXN0YWJsaXNobWVudA0KIyBDcmVhdGUgMjAwIGZ0IGJ1ZmZlcnMgYXJvdW5kIGN1cnJlbnQgbGljZW5zZXMNCiMgVGhlbiBkbyBhIHNpbWlsYXIgdGhpbmcgZm9yIG9sZGVyIGxpY2Vuc2VzIGZvciBjb21wYXJpc29uIC0gbWF5YmUgMjAxOCBvciAxOQ0KDQpuaWdodExpY2Vuc2VzIDwtIHN0X3JlYWQoImh0dHBzOi8vcGhsLmNhcnRvLmNvbS9hcGkvdjIvc3FsP3E9U0VMRUNUKyorRlJPTStidXNpbmVzc19saWNlbnNlcyZmaWxlbmFtZT1idXNpbmVzc19saWNlbnNlcyZmb3JtYXQ9Z2VvanNvbiZza2lwZmllbGRzPWNhcnRvZGJfaWQiKSAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlICVpbiUgYygiQW11c2VtZW50IiwgIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwgIlNpZGV3YWxrIENhZmUiKSB8DQogICAgICAgICAgIHN0cl9kZXRlY3QobGljZW5zZXR5cGUsICJGb29kIEVzdGFiIikpICU+JQ0KICBzdF90cmFuc2Zvcm0oY3JzID0gMjI3MikNCg0KY3VycmVudF9idWZmZXIgPC0gbmlnaHRMaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JQ0KICBzdF91bmlvbigpICU+JQ0KICBzdF9idWZmZXIoMjAwKSAlPiUNCiAgc3RfYXNfc2YoY3JzID0gMjI3MikgJT4lDQogIG11dGF0ZShpbl9idWZmZXIgPSAiaW4gYnVmZmVyIikNCg0KIyBMb2FkIENvcnJpZG9ycw0KDQpjb3JyaWRvcnMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9vcGVuZGF0YS5hcmNnaXMuY29tL2RhdGFzZXRzL2Y0M2U1ZjkyZDM0ZTQxMjQ5ZTdhMTFmMjY5NzkyZDExXzAuZ2VvanNvbiIpICU+JQ0KICBzdF9hc19zZigpICU+JQ0KICBzdF90cmFuc2Zvcm0oY3JzID0gMjI3MikNCg0KYGBgDQoNCiMjIDcuMS4gVGltZSBwYXR0ZXJucyBvZiBmaXJlYXJtIGluY2lkZW50cw0KDQpXZSBleGFtaW5lZCBhIGNhdGVnb3J5IG9mIGluY2lkZW50cyByZWNvcmRlZCBiZXR3ZWVuIEphbnVhcnkgMSwgMjAxNyBhbmQgSnVuZSAzMCwgMjAyNCAtIGluY2lkZW50cyBjbGFzc2lmaWVkIGJ5IHRoZSBQUEQgYXMgQ3JpbWluYWwgSG9taWNpZGUsIFJvYmJlcnkgd2l0aCBhIEZpcmVhcm0sIEFnZ3JhdmF0ZWQgQXNzYXVsdCB3aXRoIGEgRmlyZWFybS4NCg0KYGBge3IgdG90YWxfZ3VuX2luY2lkZW50cywgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQp2aW9sZW50Q3JpbWUgJT4lDQogICAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiKSkgJT4lDQogICAgZ3JvdXBfYnkodGV4dF9nZW5lcmFsX2NvZGUsIHllYXIsIG1vbnRoKSAlPiUNCiAgICB0YWxseSgpICU+JQ0KICAgIG11dGF0ZShkYXRlID0gbHVicmlkYXRlOjpteShwYXN0ZShtb250aCwgeWVhcikpKSAlPiUNCiAgICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2xpbmUoYWVzKHggPSBkYXRlLCB5ID0gbiwgY29sb3IgPSB0ZXh0X2dlbmVyYWxfY29kZSkpKw0KICAgIHlsaW0oMCwgNTAwKSsNCiAgICBsYWJzKHRpdGxlPSJNb250aGx5IEZpcmVhcm0gSW5jaWRlbnRzIEJ5IFR5cGUsIEphbiwgMjAxNy0gSnVuZSwgMjAyNCIsDQogICAgICAgICBzdWJ0aXRsZT0gIlNvdXJjZTogUGhpbGFkZWxwaGlhIFBvbGljZSBEZXB0LiIsDQogICAgICAgICB4PSJZZWFyIiwgDQogICAgICAgICB5PSJNb250aGx5IFJlcG9ydGVkIEluY2lkZW50cyIpKw0KICAgIHBsb3RUaGVtZQ0KDQpgYGANCg0KYGBge3IgZGF5X2FuZF90aW1lLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSB9DQoNCnZpb2xlbnRDcmltZSAlPiUNCiAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiKSkgJT4lDQogIGdyb3VwX2J5KGFmdGVyX3NpeCwgeWVhciwgbW9udGgpICU+JQ0KICB0YWxseSgpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGx1YnJpZGF0ZTo6bXkocGFzdGUobW9udGgsIHllYXIpKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBkYXRlLCB5ID0gbiwgY29sb3IgPSBhZnRlcl9zaXgpKSsNCiAgICB5bGltKDAsIDUwMCkrDQogIGxhYnModGl0bGU9Ik1vbnRobHkgRmlyZWFybSBJbmNpZGVudHMgQnkgVGltZSBvZiBEYXksIDIwMTctMjAyNCIsDQogICAgICAgc3VidGl0bGU9ICJIb21pY2lkZSwgQWdncmF2YXRlZCBBc3NhdWx0LCBSb2JiZXJ5IHdpdGggRmlyZWFybXMuXG4gU291cmNlOiBQaGlsYWRlbHBoaWEgUG9saWNlIERlcHQuIiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iTW9udGhseSBSZXBvcnRlZCBJbmNpZGVudHMiKSsNCiAgcGxvdFRoZW1lDQpgYGANCg0KTW9zdCBndW4gY3JpbWUsIG92ZXJhbGwsIGhhcHBlbnMgaW4gdGhlIGV2ZW5pbmcsIGJldHdlZW4gYWJvdXQgMTEgUE0gYW5kIDFBTSwgd2l0aCBtdWNoIG9mIGl0IGNvbmNlbnRyYXRlZCBhcm91bmQgbWlkbmlnaHQuIA0KDQpgYGB7ciBhbGxfY3JpbWVzX2RheSwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQp2aW9sZW50Q3JpbWUgJT4lDQogIGZpbHRlcih0ZXh0X2dlbmVyYWxfY29kZSAlaW4lIGMoIkFnZ3JhdmF0ZWQgQXNzYXVsdCBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwgIikpICU+JQ0KICBncm91cF9ieShob3VyLCBkb3R3KSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeD0gaG91ciwgeSA9IG4pKSsNCiAgZmFjZXRfd3JhcCh+ZG90dykrDQogIGxhYnModGl0bGU9IkhvdXJseSBSZXBvcnRlZCBGaXJlYXJtIEluY2lkZW50cywgMjAxNy0yMDI0IiwNCiAgICAgICBzdWJ0aXRsZT0gIkhvbWljaWRlIGFuZCBBZ2dyYXZhdGVkIEFzc2F1bHQsIFJvYmJlcnkgd2l0aCBGaXJlYXJtcy5cbiBTb3VyY2U6IFBoaWxhZGVscGhpYSBQb2xpY2UgRGVwdC4iLA0KICAgICAgIHg9IkhvdXIgb2YgdGhlIERheSIsIA0KICAgICAgIHk9IkhvdXJseSBSZXBvcnRlZCBJbmNpZGVudHMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpUaGUgZm9sbG93aW5nIHBsb3RzIHNob3cgYWxsIGZpcmVhcm0gaW5jaWRlbnRzIHNpbmNlIDIwMjAsIGJyb2tlbiBkb3duIGJ5IGRheSBvZiB0aGUgd2VlayBhbmQgaG91ciByZXBvcnRlZC4gVGhlIDEyUE0gKDBoKSB0aW1lIG9mIGRheSBoYXMgdGhlIGhpZ2hlc3QgcmVwb3J0aW5nIGNvdW50IGJ5IGZhciBvZiBhbnkgdGltZSBvZiBkYXkuIEl0IGlzIHVuY2xlYXIgaG93IG11Y2ggb2YgdGhhdCBpcyByZWxhdGVkIHRvIHJlY29yZC1rZWVwaW5nIHByYWN0aWNlcywgYnV0IGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHRoZXJlJ3MgYSBwYXR0ZXJuLg0KDQoNCiMjIDcuMi4gU3BhdGlhbCBQYXR0ZXJuIG9mIE5pZ2h0dGltZSBJbmNpZGVudHMNCg0KV2UgcmVsYXRlZCB0aGVzZSBmaXJlYXJtIGluY2lkZW50cyAoYW5kIG90aGVyIHZpb2xlbnQgY3JpbWUgaW5jaWRlbnRzKSB0byB0d28gdHlwZXMgb2YgZGF0YSwgd2FudGluZyB0byBrbm93IGhvdyBmcmVxdWVudGx5IGluY2lkZW50cyB3ZXJlIGhhcHBlbmluZyBuZWFyIGhvc3BpdGFsaXR5IGxvY2F0aW9ucyBhdCBuaWdodC4NCg0KMS4gUGhpbGFkZWxwaGlhIExpY2Vuc2VzIGFuZCBJbnNwZWN0aW9ucyByZWNvcmRzIG9mIEFtdXNlbWVudCwgU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kgTGljZW5zZXMsIFNpZGV3YWxrIENhZmUgbGljZW5zZXMsIGFuZCBhbnkgdHlwZSBvZiBGb29kIEVzdGFibGlzaG1lbnQgTGljZW5zZS4gYW5kIA0KDQoyLiBDb21tZXJjaWFsIGNvcnJpZG9yIGJvdW5kYXJpZXMga2VwdCBieSB0aGUgRGVwYXJ0bWVudCBvZiBDb21tZXJjZS4NCg0KS2VlcCBpbiBtaW5kIC0gd2UgZG8gbm90IGtub3cgcGFydGljdWxhcmx5IHdoZW4gdGhlc2UgZXN0YWJsaXNobWVudHMgYXJlIG9wZW4gYW5kIGNsb3NlZC4gV2UgZG9uJ3Qga25vdyBpZiBhbiBpbmNpZGVudCBhdCAxMVBNIG91dHNpZGUgYSByZXN0YXVyYW50IGhhcHBlbnMgd2hpbGUgdGhhdCByZXN0YXVyYW50IGlzIGluIGFjdGl2ZSBvcGVyYXRpb24uIFdlIGZpbHRlcmVkIG91dCBpbmNpZGVudHMgdGhhdCB0b29rIHBsYWNlIG5lYXIgbGljZW5zZSBsb2NhdGlvbnMgd2hlbiB0aG9zZSBsaWNlbnNlcyB3ZXJlIG5vdCBhY3RpdmUgKGUuZy4gYmVmb3JlIHRoZXkgd2VyZSBjcmVhdGVkKS4NCg0KLS0tLS0NCg0KV2UgZXhhbWluZWQgYSB3aWRlIHZhcmlldHkgb2YgdmlvbGVudCBjcmltZXMgaW4gY29tbWVyY2lhbCBjb3JyaWRvcnMgYW5kIHdpdGhpbiAyMDAgZmVldCBvZiByZXN0YXVyYW50cywgYXNzZW1ibHkgYW5kIGFtdXNlbWVudCBidXNpbmVzc2VzLiBUaGlzIHRpbWVsaW5lIHNob3dzIHRoYXQgYXQgYW55IHRpbWUgb2YgZGF5LCBhbnkgZGF5IG9mIHRoZSB3ZWVrLCB0aGVyZSBhcmUgZmFyIG1vcmUgaW5jaWRlbnRzIG9mIGFnZ3JhdmF0ZWQgYXNzYXVsdCwgcm9iYmVyeSwgdGhlZnQsIHJhcGUsIHNleHVhbCBjcmltZXMsIGFuZCBob21pY2lkZSBhd2F5IGZyb20gYXJlYXMgb2YgaG9zcGl0YWxpdHkgYWN0aXZpdHkuDQoNCkl0IGlzIHN1YnN0YW50aWFsbHkgbW9yZSBsaWtlbHkgb25lIHdpbGwgYmUgZXhwb3NlZCB0byBhIHZpb2xlbnQgY3JpbWUgYXQgYWxtb3N0IGFueSBob3VyIG9mIHRoZSBkYXkgYXdheSBmcm9tIGEgbGljZW5zZWQgZXN0YWJsaXNobWVudCBhdCBhbnkgdGltZSBvZiBkYXksIGFzIGNvbXBhcmVkIHRvIGEgd2Vla2VuZCBuaWdodCBuZWFyIGEgbGljZW5zZWQgZXN0YWJsaXNobWVudC4NCg0KYGBge3IgYWxsX2NyaW1lc18yMDBfZnQsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc3Rfam9pbih2aW9sZW50Q3JpbWVfc2hwICU+JSANCiAgICAgICAgICBmaWx0ZXIoeWVhciA+IDIwMjApICU+JQ0KICAgICAgICAgIGZpbHRlcih0ZXh0X2dlbmVyYWxfY29kZSAlaW4lIGMoIkFnZ3JhdmF0ZWQgQXNzYXVsdCBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWdncmF2YXRlZCBBc3NhdWx0IE5vIEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IE5vIEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXBlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgU2V4IE9mZmVuc2VzIChOb3QgQ29tbWVyY2lhbGl6ZWQpIikpLCBjdXJyZW50X2J1ZmZlcikgJT4lDQogIG11dGF0ZShQcm94aW1hdGVfVG9fTGljZW5zZSA9IGlmZWxzZShpcy5uYShpbl9idWZmZXIpID09IFRSVUUsICJPdmVyIDIwMCBmdCBBd2F5IiwgIldpdGhpbiAyMDAgZnQiKSkgJT4lDQogIGdyb3VwX2J5KFByb3hpbWF0ZV9Ub19MaWNlbnNlLCBkb3R3LCBob3VyKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgICBnZ3Bsb3QoKSsNCiAgICBnZW9tX2JhcihhZXMoeCA9IGhvdXIsIHkgPSBuLCBmaWxsID0gUHJveGltYXRlX1RvX0xpY2Vuc2UpLCANCiAgICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZmFjZXRfd3JhcCh+ZG90dykrDQogIGxhYnModGl0bGU9IkhvdXJseSBSZXBvcnRlZCBWaW9sZW50IENyaW1lcywgMjAyMS0yMDI0IGJ5IFxuUHJveGltaXR5IHRvIEhvcHNpdGFsaXR5IExpY2Vuc2VzIiwNCiAgICAgICBzdWJ0aXRsZT0gIkhvbWljaWRlLCBBZ2dyYXZhdGVkIEFzc2F1bHQsIFJhcGUsIFNleCBPZmZlbnNlcywgUm9iYmVyeSAtIHdpdGggYW5kIHdpdGhvdXQgRmlyZWFybXMuIFxuU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgQ29tbWVyY2UsIERlcHQuIExpY2Vuc2VzIGFuZCBJbnNwZWN0aW9ucywgUGhpbGFkZWxwaGlhIFBvbGljZSBEZXB0LiIsDQogICAgICAgeD0iSG91ciBvZiB0aGUgRGF5IiwgDQogICAgICAgeT0iTnVtYmVyIG9mIFJlcG9ydGVkIEluY2lkZW50cyIpKw0KICBwbG90VGhlbWUNCg0KYGBgDQoNCk9uIGF2ZXJhZ2UsIGNvbW1lcmNpYWwgY29ycmlkb3JzIGhhdmUgYWJvdXQgYXMgbWFueSBpbmNpZGVudHMgY2l0eS13aWRlIGF0IDRQTSBhcyB0aGV5IGRvIGF0IDEwIG9yIFBNLiBGb3IgdGhlIG1vc3QgcGFydCwgdmlvbGVuY2Ugb24gY29ycmlkb3JzIGRvZXMgbm90IHNwaWtlIG9uIHdlZWtlbmRzLCBzdXJwcmlzaW5nbHkuDQoNCkluY2lkZW50cyBpbiBjb21tZXJjaWFsIGFyZWFzLCBuZWFyIGVzdGFibGlzaG1lbnRzIG1ha2UgdXAgMTAtMTUlIG9mIGluY2lkZW50cyBjaXR5LXdpZGUgYXQgbmlnaHQgLSBhIHN0ZWFkeSByYXRlIGZvciBvdmVyIDUgeWVhcnMuIChBcyBvZiA2LzEwLCAxOTUwIHRvdGFsIGluY2lkZW50cyA2UE0tNkFNLCAyMjIgdy9pbiAyMDAgZnQgb2YgYSBidXNpbmVzcyBpbiBhIGNvcnJpZG9yKS4gV2UgZG9uJ3QgaGF2ZSBpbmZvIGFib3V0IHNwZWNpZmljIG9wZW4vY2xvc2UgaG91cnMgdG8ga25vdyBleGFjdGx5IHdoYXQgYnVzaW5lc3NlcyBtaWdodCBoYXZlIGJlZW4gb3BlbiBkdXJpbmcgd2hhdCBpbmNpZGVudHMuDQoNCkluY2lkZW50cyBpbiBjb3JyaWRvcnMgdHJhY2sgdGhlIGNpdHkncyBvdmVyYWxsIHRyZW5kcyBwcmV0dHkgY2xvc2VseS4NCg0KYGBge3IgY29ycmlkb3JfdGltZXNlcmllcywgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UgIH0NCnN0X2pvaW4odmlvbGVudENyaW1lX3NocCAlPiUgDQogICAgICAgICAgZmlsdGVyKHRleHRfZ2VuZXJhbF9jb2RlICVpbiUgYygiQWdncmF2YXRlZCBBc3NhdWx0IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb2JiZXJ5IEZpcmVhcm0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCAiICkpLCANCiAgICAgICAgY29ycmlkb3JzKSAlPiUNCiAgbXV0YXRlKGluX0NvcnJpZG9yID0gaWZlbHNlKGlzLm5hKE5BTUUpID09IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHNpZGUgQ29ycmlkb3IiLCAiSW5zaWRlIENvcnJpZG9yIikpICU+JQ0KICBncm91cF9ieShpbl9Db3JyaWRvciwgYWZ0ZXJfc2l4LCB5ZWFyLCBtb250aCkgJT4lDQogIHRhbGx5KCkgJT4lDQogIG11dGF0ZShkYXRlID0gbHVicmlkYXRlOjpteShwYXN0ZShtb250aCwgeWVhcikpKSAlPiUNCiAgZmlsdGVyKGFmdGVyX3NpeCA9PSAiNlBNIC0gNkFNIikgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBkYXRlLCB5ID0gbiwgY29sb3IgPSBpbl9Db3JyaWRvcikpKw0KICAgICAgeWxpbSgwLCA0MDApKw0KICBsYWJzKHRpdGxlPSJNb250aGx5IE5pZ2h0dGltZSBGaXJlYXJtIEluY2lkZW50cyBJbnNpZGUgYW5kIE91dHNpZGUgQ29tbWVyY2lhbCBDb3JyaWRvcnMsIDIwMTctMjAyNCIsDQogICAgICAgc3VidGl0bGU9ICJIb21pY2lkZSBhbmQgQWdncmF2YXRlZCBBc3NhdWx0LCBSb2JiZXJ5IHdpdGggRmlyZWFybXMuIDZQTS02QU0uXG4gU291cmNlOiBQaGlsYWRlbHBoaWEgRGVwdC4gT2YgTGljZW5zZXMgJiBJbnNwZWN0aW9ucywgUGhpbGFkZWxwaGlhIFBvbGljZSBEZXB0LiIsDQogICAgICAgeD0iWWVhciIsIA0KICAgICAgIHk9Ik51bWJlciBvZiBSZXBvcnRlZCBJbmNpZGVudHMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpJbmNpZGVudHMgd2l0aGluIDIwMCBmZWV0IG9mIGEgbGljZW5zZWQgZXN0YWJsaXNobWVudCBhbHNvIHRyYWNrIGdlbmVyYWwgdHJlbmRzIC0gbm90aWNlIGhvdyBmZXcgaW5jaWRlbnRzIHRha2UgcGxhY2UgbmVhciBlc3RhYmxpc2htZW50cy4NCg0KYGBge3Igd2l0aGluXzIwMCwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UgfQ0KDQpzdF9qb2luKHZpb2xlbnRDcmltZV9zaHAgJT4lIA0KICAgICAgICAgIGZpbHRlcih0ZXh0X2dlbmVyYWxfY29kZSAlaW4lIGMoIkFnZ3JhdmF0ZWQgQXNzYXVsdCBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwgIiApKSwgDQogICAgICAgIGN1cnJlbnRfYnVmZmVyKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBtdXRhdGUoUHJveGltYXRlX1RvX0xpY2Vuc2UgPSBpZmVsc2UoaXMubmEoaW5fYnVmZmVyKSA9PSBUUlVFLCAiT3ZlciAyMDAgZnQgQXdheSIsICJXaXRoaW4gMjAwIGZ0IikpICU+JQ0KICBncm91cF9ieShQcm94aW1hdGVfVG9fTGljZW5zZSwgYWZ0ZXJfc2l4LCB5ZWFyLCBtb250aCkgJT4lDQogIHRhbGx5KCkgJT4lDQogIG11dGF0ZShkYXRlID0gbHVicmlkYXRlOjpteShwYXN0ZShtb250aCwgeWVhcikpKSAlPiUNCiAgZmlsdGVyKGFmdGVyX3NpeCA9PSAiNlBNIC0gNkFNIikgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBkYXRlLCB5ID0gbiwgY29sb3IgPSBQcm94aW1hdGVfVG9fTGljZW5zZSkpKw0KICBsYWJzKHRpdGxlPSJNb250aGx5IE5pZ2h0dGltZSBGaXJlYXJtIEluY2lkZW50cyBCeSBQcm94aW1pdHkgdG9cbkFzc2VtYmx5LCBSZXN0YXVyYW50IG9yIEFtdXNlbWVudCBMaWNlbnNlLCAyMDE4LTIwMjQiLA0KICAgICAgIHN1YnRpdGxlPSAiSG9taWNpZGUsIEFnZ3JhdmF0ZWQgQXNzYXVsdCwgUm9iYmVyeSB3aXRoICBGaXJlYXJtcy42UE0tNkFNLlxuIFNvdXJjZTogUGhpbGFkZWxwaGlhIERlcHQuIE9mIExpY2Vuc2VzICYgSW5zcGVjdGlvbnMsIFBoaWxhZGVscGhpYSBQb2xpY2UgRGVwdC4iLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgUmVwb3J0ZWQgSW5jaWRlbnRzIikrDQogIHBsb3RUaGVtZQ0KDQpgYGANCg0KIyMgNy4zLiBJbnRlcmFjdGl2ZSBNYXAgb2YgSW5jaWRlbnRzIGluIENvbW1lcmNpYWwgQ29ycmlkb3JzDQoNClRoaXMgaW50ZXJhY3RpdmUgbWFwIHNob3dzIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlyZWFybSBpbmNpZGVudHMgNlBNLTZBTSBzaW5jZSAyMDE3IHJlcG9ydGVkIGluIHRoZSBDaXR5J3MgY29tbWVyY2lhbCBjb3JyaWRvcnMuIEhvdmVyIG92ZXIgZWFjaCBzcGVjaWZpYyBhcmVhIHRvIHNlZSBhIGJyZWFrZG93biBvZiBpbmNpZGVudHMgYnkgeWVhci4gVGhlIGNvbG9yIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgaW5jaWRlbnRzIGZvciB0aGUgZnVsbCBjYWxlbmRhciB5ZWFyIDIwMjMuDQoNCmBgYHtyIGluY2lkZW50X21hcHZpZXcsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc3Rfam9pbih2aW9sZW50Q3JpbWVfc2hwICU+JSANCiAgICAgICAgICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIgKSksIA0KICAgICAgICBjb3JyaWRvcnMpICU+JQ0KICBmaWx0ZXIoaXMubmEoTkFNRSkgPT0gRkFMU0UpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KE5BTUUsICJTb3V0aCIpKSAlPiUNCiAgZmlsdGVyKGFmdGVyX3NpeCA9PSAiNlBNIC0gNkFNIikgJT4lDQogIGdyb3VwX2J5KE5BTUUsIHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdCgtZ2VvbWV0cnkpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0geWVhciwgdmFsdWVzX2Zyb20gPSBuKSAlPiUNCiAgbXV0YXRlKGAyMDE3YCA9IGlmZWxzZShpcy5uYShgMjAxN2ApID09IFRSVUUsIDAsIGAyMDE3YCksDQogICAgICAgICBgMjAxOGAgPSBpZmVsc2UoaXMubmEoYDIwMThgKSA9PSBUUlVFLCAwLCBgMjAxOGApLA0KICAgICAgICAgYDIwMTlgID0gaWZlbHNlKGlzLm5hKGAyMDE5YCkgPT0gVFJVRSwgMCwgYDIwMTlgKSwNCiAgICAgICAgIGAyMDIwYCA9IGlmZWxzZShpcy5uYShgMjAyMGApID09IFRSVUUsIDAsIGAyMDIwYCksDQogICAgICAgICBgMjAyMWAgPSBpZmVsc2UoaXMubmEoYDIwMjFgKSA9PSBUUlVFLCAwLCBgMjAyMWApLA0KICAgICAgICAgYDIwMjJgID0gaWZlbHNlKGlzLm5hKGAyMDIyYCkgPT0gVFJVRSwgMCwgYDIwMjJgKSwNCiAgICAgICAgIGAyMDIzYCA9IGlmZWxzZShpcy5uYShgMjAyM2ApID09IFRSVUUsIDAsIGAyMDIzYCksDQogICAgICAgICBgMjAyNGAgPSBpZmVsc2UoaXMubmEoYDIwMjRgKSA9PSBUUlVFLCAwLCBgMjAyNGApKSU+JQ0KICBsZWZ0X2pvaW4oLiwgY29ycmlkb3JzICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoTkFNRSksIGJ5ID0gYygiTkFNRSIpKSAlPiUNCiBtdXRhdGUoSW5jaWRlbnRzX1NpbmNlXzIwMTcgPSBgMjAxN2ArIGAyMDE4YCArIGAyMDE5YCArIGAyMDIwYCArIGAyMDIxYCArIGAyMDIyYCArIGAyMDIzYCArIGAyMDI0YCkgJT4lDQogIHJlbG9jYXRlKGAyMDIwYCwgLmFmdGVyID0gYDIwMTlgKSAlPiUNCiAgcmVsb2NhdGUoYDIwMThgLCAuYWZ0ZXIgPSBgMjAxN2ApICU+JQ0KICByZWxvY2F0ZShgMjAyMWAsIC5hZnRlciA9IGAyMDIwYCkgJT4lDQogIHN0X2FzX3NmKCkgJT4lDQogIHN0X3RyYW5zZm9ybSgyMjcyKSAlPiUNCiAgbWFwVmlldyh6Y29sID0gIjIwMjMiKQ0KDQpgYGANCg0KU29tZSBjb21tZW50YXJ5IHJlZ2FyZGluZyB0aGlzIG1hcDoNCg0KQXMgd2Ugc2F3IGluIDIwMjEvMjIsIHRoZSBjb3JyaWRvcnMgaW4gdGhlIGNpdHkgd2l0aCB0aGUgbW9zdCBmaXJlYXJtIGluY2lkZW50cyAoYWdncmF2YXRlZCBhc3NhdWx0LCByb2JiZXJ5LCBob21pY2lkZSkgYXJlIHRoZSBvbmVzIGluIGFyZWFzIHdpdGggZXBpZGVtaWMgZ3VuIHZpb2xlbmNlIChlLmcuIEtlbnNpbmd0b24gYW5kIEFsbGVnaGVueSwgQnJvYWQgYW5kIFN1c3F1ZWhhbm5hLCA1Mm5kIFN0LikuIFRoaXMgaW50ZW5zaXR5IGlzIGVzcGVjaWFsbHkgcHJvbm91bmNlZCB3aGVuIHlvdSBjb25zaWRlciB0aGVpciBzaXplLiBUaGVyZSBpcyBhbHNvIGEgcmVsYXRpdmVseSBoaWdoIG51bWJlciBvZiBpbmNpZGVudHMgYWxvbmcgdGhlIG1haW4gdHJhbnNpdCBjb3JyaWRvcnMgLSB0aGUgRUwgYW5kIHRoZSBCcm9hZCBTdC4gbGluZSBpbiBXZXN0LCBOb3J0aCBhbmQgbG93ZXIgTm9ydGhlYXN0IFBoaWxseS4NCg0KU29tZSBvZiB0aGUgbW9zdCBwb3B1bGFyICJkZXN0aW5hdGlvbiIgY29ycmlkb3JzIC0gdGhvc2UgdGhhdCBoYXZlIHJlZ2lvbmFsIHZpc2l0b3JzaGlwIChDZW50ZXIgQ2l0eSwgU3RhZGl1bXMsIFNvdXRoIFN0LCBEZWxhd2FyZSBXYXRlcmZyb250KSBoYXZlIHZlcnkgbG93IG51bWJlcnMgb2YgaW5jaWRlbnRzIGdpdmVuIHRoZWlyIHZvbHVtZSBvZiB0cmFmZmljLiAoVGhlIHN0YWRpdW1zIGhhdmUgb25lIGluY2lkZW50IHNpbmNlIDIwMTchKSBUaGUgbnVtYmVycyBpbiBGaXNodG93biwgRGVsYXdhcmUgQXZlLCBTb3V0aCBTdHJlZXQgLSB0aGV5IGFyZSB2ZXJ5IGxvdy4gT25lIGluY2lkZW50IGlzIHRvbyBtYW55LCBidXQgaXQncyBjZXJ0YWlubHkgbm90YWJsZSB0aGF0IHRoaXMgaXMgTk9UIHRoZSBwcmltYXJ5IGFyZWEgd2hlcmUgZ3VuIHZpb2xlbmNlIGlzIHRha2luZyBwbGFjZS4NCg0KQSBub3RhYmxlIGV4Y2VwdGlvbiB0byB0aGlzIGFyZSB0aGUgRWFzdCBNYXJrZXQgYW5kIFdlc3QgTWFya2V0IGFyZWFzIC0gdGhlc2UgYXJlYXMgY292ZXIgYmFzaWNhbGx5IGFsbCBvZiB0aGUgQ2VudGVyIENpdHkgYnVzaW5lc3MgZGlzdHJpY3QsIGFuZCB0aGV5IGhhdmUgYW1vbmcgdGhlIG1vc3QgaW5jaWRlbnRzIG9mIGFueSBjb3JyaWRvciAoYWFweCAyMCBpbiAyMDIzKSAuLi4uIEJVVCAuLi4uIGEpIHRoZXkgaGF2ZSwgYnkgYSAyMDE5IGVzdGltYXRlIC0gMjV4ICh5ZXMgeW91IHJlYWQgdGhhdCByaWdodCkgdGhlIHZpc2l0YXRpb24gb2YgdGhlIGF2ZXJhZ2UgUGhpbGFkZWxwaGlhIGNvcnJpZG9yIGFuZCBiKSB0aGV5IGNvdmVyIGV4dHJlbWVseSBsYXJnZSBhcmVhcy4NCg0KSW5jaWRlbnRzIGluIHRoZSBmaXJzdCBoYWxmIG9mIDIwMjQgYXJlIGRvd24gYSBsb3QgLSBXZXN0IE1hcmtldCBoYXMgZmFsbGVuIG91dCBvZiB0aGUgdG9wIGdyb3VwIG9mIGNvcnJpZG9ycyBieSBpbmNpZGVudCBjb3VudCwgYW5kIG92ZXJhbGwgaW5jaWRlbnRzIGFyZSANCg0KU3R1ZGVudHMgb2YgbWluZSBhbmFseXplZCAyMDE5IHBob25lIEdQUyBkYXRhIGZyb20gdGhpcmQgcGFydGllcyB0byB0aGVzZSBjb3JyaWRvcnMgYXQgbmlnaHQgLSB5b3UgY2FuIGxvb2sgYXQgaG93IG1hbnkgcGVvcGxlIGdvIHRvIGVhY2ggY29ycmlkb3IgYW5kIGZyb20gd2hlcmUgdXNpbmcgdGhpcyBhcHA6IGh0dHBzOi8vc2FicmluYXNtbGVlLmdpdGh1Yi5pby9leHBsb3JhdG9yeV9wYWdlL2hvbWUuaHRtbA0KDQojIyMgNy4zLjEuIDIwMjMgRnVsbCBZZWFyIEluY2lkZW50cw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpzdF9qb2luKHZpb2xlbnRDcmltZV9zaHAgJT4lIA0KICAgICAgICAgIGZpbHRlcih0ZXh0X2dlbmVyYWxfY29kZSAlaW4lIGMoIkFnZ3JhdmF0ZWQgQXNzYXVsdCBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9iYmVyeSBGaXJlYXJtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9taWNpZGUgLSBDcmltaW5hbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwgIiApKSwgDQogICAgICAgIGNvcnJpZG9ycykgJT4lDQogIGZpbHRlcihpcy5uYShOQU1FKSA9PSBGQUxTRSkgJT4lDQogICMgZmlsdGVyKHN0cl9kZXRlY3QoTkFNRSwgIlNvdXRoIikpICU+JQ0KICBmaWx0ZXIoYWZ0ZXJfc2l4ID09ICI2UE0gLSA2QU0iKSAlPiUNCiAgZ3JvdXBfYnkoTkFNRSwgeWVhcikgJT4lDQogIHRhbGx5KCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgc2VsZWN0KC1nZW9tZXRyeSkgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMjMpICU+JQ0KICBhcnJhbmdlKC1uKSAlPiUNCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZygpICU+JQ0KICBzY3JvbGxfYm94KGhlaWdodCA9ICI0MDBweCIsIHdpZHRoID0gIjEwMCUiKQ0KDQpgYGANCg0KIyMjIDcuMy4yLiAyMDI0IEluY2lkZW50cyAoSmFuLUp1bmUgMSkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc3Rfam9pbih2aW9sZW50Q3JpbWVfc2hwICU+JSANCiAgICAgICAgICBmaWx0ZXIodGV4dF9nZW5lcmFsX2NvZGUgJWluJSBjKCJBZ2dyYXZhdGVkIEFzc2F1bHQgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvYmJlcnkgRmlyZWFybSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWljaWRlIC0gQ3JpbWluYWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21pY2lkZSAtIENyaW1pbmFsICIgKSksIA0KICAgICAgICBjb3JyaWRvcnMpICU+JQ0KICBmaWx0ZXIoaXMubmEoTkFNRSkgPT0gRkFMU0UpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KE5BTUUsICJTb3V0aCIpKSAlPiUNCiAgZmlsdGVyKGFmdGVyX3NpeCA9PSAiNlBNIC0gNkFNIikgJT4lDQogIGdyb3VwX2J5KE5BTUUsIHllYXIpICU+JQ0KICB0YWxseSgpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdCgtZ2VvbWV0cnkpICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDI0KSAlPiUNCiAgYXJyYW5nZSgtbikgJT4lDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiNDAwcHgiLCB3aWR0aCA9ICIxMDAlIikNCg0KYGBg